【发布时间】:2013-03-11 17:03:38
【问题描述】:
我启动一个批处理文件来处理一些代码,一次它调用另一个批处理文件并且应该返回一个变量,但是手册页中解释的关于 local/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
我尝试了不同的 return var 语法,例如 !val1! 或 %%val1 - 没有任何效果。我错过了什么?
更新: regarding to other example here on site我试过了:
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 的精彩代码
【问题讨论】:
-
为什么不在内部批处理中设置环境变量?像这样
set RETURNVALUE=your_value -
@if行完全没有任何作用,因为字符串(@a永远不会等于字符串@b)。前导@抑制该 ONE 语句的 echo-statement-to-console。它可能可以被安全地删除,除非正在使用一些非常晦涩的方法,就像其他一些 [batch?] 程序试图在 .bat 源中找到该字符串。 -
但它是在内部批次中设置的,不是吗?在倒数第三行
do set val1=%%x- 如果我取出 endlocal 代码段在调用批处理时结果为空? -
Peter 是对的,第一行什么都不做 - 在批处理中但是:FOR 命令将同一个文件 (jscript "%~f0") 作为 Java 脚本调用。 Java 将 /* 解释为注释的开头(如 REM)。脚本中的其他地方应该有一个 */ 来指示“EndComment” - 就在 java 代码开始之前。因此,您可以使用与 Batch 和 Java 脚本相同的文件
标签: variables batch-file return env