返回var回调用批处理文件



我开始一个批处理文件来处理一些代码,在一个时间它调用另一个批处理文件,应该得到返回一个变量,但在手册页中解释的方法关于本地/endlocal似乎不在这里工作,我做错了什么请?

第一个批处理文件:
@ECHO OFF
setlocal
call secondbatchfile.bat xyz
echo. [%val1%]

第二个批处理文件:

@if (@a==@b) @end /*                        <== btw what does this code do ???
@echo off
setlocal enabledelayedexpansion
set "URL=%~1"
set bla bla ...
do bla bla ...
for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0" "%URL%"') do (
rem trim whitespace from beginning and end of line
for /f "tokens=*" %%x in ("%%~I") do set "line=%%x"
rem test that trimmed line matches "variable=number"
echo !line! | findstr /i "^to[a-z]*=[0-9]*" >NUL && (
rem test was successful.  Scrape number.
for /f "tokens=2 delims==" %%x in ("%%I") do set "val1=%%x"
echo !val1!                            <== this works
ENDLOCAL & SET top=%val1%              <== this not
)
)

结果是:

c:test>firstbatchfile.bat
123456789                                   <== this works
 []                                         <== this not

我尝试了不同的返回变量语法,如!val1!%%val1 -没有工作。我错过了什么?

更新:关于网站上的其他例子,我尝试了:

call seconbatchfile.bat xyz ret1
echo. [%2%] [%ret1%]

和在第二个文件更改:

rem ENDLOCAL & SET %2=!val1!

也不工作?

解决方案:

第二个批处理文件可以是从rojo读取整个网站的原始脚本,我确实留下了修剪和匹配语法行,只返回相关的匹配:

for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0" "%URL%"') do (
rem trim whitespace from beginning and end of line
for /f "tokens=*" %%x in ("%%~I") do set "line=%%x"
rem test that trimmed line matches "variable=number"
echo !line! | findstr /i "^[a-z]*=[0-9]*" >NUL && (
echo(%%I
)
)

和第一个调用它的批处理文件将搜索两个所需的参数,如下所示:

@ECHO OFF
setlocal
for /f "delims=" %%I in ('secondbatchfile.bat "http://xyz"') do (
echo %%I | findstr /i "top" >NUL && (
for /f "tokens=2 delims==" %%x in ("%%I") do (
set "updir=%%x"
)
)
echo %%I | findstr /i "low" >NUL && (
for /f "tokens=2 delims==" %%x in ("%%I") do (
set "lowdir=%%x"
)
)
)
echo.[%updir%]
echo.[%lowdir%]

非常感谢rojo的精彩代码

最简单的解决方案是让第二个批处理文件回显其结果,并在第一个批处理文件中使用for循环捕获它。取消setlocal以将环境变量传递回调用脚本是一件混乱的事情。

first.bat:

@echo off
setlocal
for %%x in (
    "http://10.0.0.1/foo/vars.txt"
    "http://10.0.0.1/bar/vars.txt"
    "http://10.0.0.1/baz/vars.txt"
    "http://10.0.0.1/qux/vars.txt"
    "http://10.0.0.1/corge/vars.txt"
) do (
    for /f "delims=" %%I in ('fetchvalue.bat "%%~x"') do (
        set "val1=%%I"
    )
    echo.[%val1%]
)

fetchvalue.bat:

@if (@a==@b) @end /*
:: fetchvalue.bat <url>
:: output the "value" part of variable=value from a text file served by http
@echo off
setlocal
if "%~1"=="" goto usage
echo "%~1" | findstr /i "https*://" >NUL || goto usage
set "URL=%~1"
for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0" "%URL%"') do (
    rem trim whitespace from beginning and end of line
    for /f "tokens=*" %%x in ("%%~I") do set "line=%%x"
    rem test that trimmed line matches "variable=number"
    echo !line! | findstr /i "^to[a-z]*=[0-9]*" >NUL && (
        rem test was successful.  Scrape number.
        for /f "tokens=2 delims==" %%x in ("%%I") do echo(%%x
    )
)
goto :EOF
:usage
echo Usage: %~nx0 URL
echo     for example: %~nx0 http://www.google.com/
echo;
echo The URL must be fully qualified, including the http:// or https://
goto :EOF
JScript */
var x=new ActiveXObject("Microsoft.XMLHTTP");
x.open("GET",WSH.Arguments(0),true);
x.setRequestHeader('User-Agent','XMLHTTP/1.0');
x.send('');
while (x.readyState!=4) {WSH.Sleep(50)};
WSH.Echo(x.responseText);

下面是一个示例first.bat,它将对获取的值进行排序,将low设置为最低值,并将high设置为最高值。

@echo off
setlocal enabledelayedexpansion
for %%x in (
    "http://10.0.0.1/foo/vars.txt"
    "http://10.0.0.1/bar/vars.txt"
    "http://10.0.0.1/baz/vars.txt"
    "http://10.0.0.1/qux/vars.txt"
    "http://10.0.0.1/corge/vars.txt"
) do (
    set low=
    for /f "delims=" %%I in ('fetchvalue.bat "%%~x" ^| sort') do (
        if not defined low set "low=%%I"
        set "high=%%I"
    )
    echo low: !low!
    echo high: !high!
)

通过设置一个名为top: set top=%val1%的环境变量来结束内部批处理文件。您需要将其更改为set val1=%val1%

...
echo !val1!
ENDLOCAL & SET val1=%val1%

相关内容

  • 没有找到相关文章

最新更新