我有一个常见的.bat文件,它读取status.xml文件并找出状态字段的值。然后,其他批处理文件调用此批处理文件以查找状态值。调用批处理文件将文件名发送到公共bat文件。 我无法将状态从公共批处理文件发送到调用批处理文件。 有人可以帮忙吗?
main batch file
-- will call the common bat file and send the file name and a variable as arguments
setlocal
call Common.bat c:\folderdir\files\status.xml val1
-- trying to print the status returned by the common bat file
echo [%val1%]
common batch file
@ECHO off
setlocal EnableDelayedExpansion
rem will loop through the file and read the value of the status tag
(for /F "delims=" %%a in (%1) do (
set "line=%%a"
set "newLine=!line:<Interface_status>=!"
set "newLine=!newLine:</Interface_status>=!"
if "!newLine!" neq "!line!" (
@echo Status is !newLine!
rem I want to send`enter code here` the value of newLine to the calling batch file
set %~2 = !newLine! <--this does not work
)
))
答案 0 :(得分:4)
在SETLOCAL / ENDLOCAL括号内(其中EOF = ENDLOCAL)将撤消对环境所做的任何更改。
您需要在Common.bat
内设置一个在最后的闭括号后可见的变量(即您的返回值 - 它可能是一个空字符串。
然后,在common.bat
的最后一个括号之后的行中,放上这一行:
ENDLOCAL&set %~2=%returnvalue%
其中returnvalue
包含呃,你希望返回的值(有趣,那......)
BTW:字符串SET
是SPACE-SENSITIVE。如果该行有效,您将设置变量"VAR1 "
- 而不是"VAR1"
- 变量名中=
包含的空格 - 以及{{之后的任何空格1}}同样包含在分配的值中。
语法
=
通常用于排除某一行上的任何杂散尾随空格(某些编辑可能会留下)
(叹气)...
set "var=value"
答案 1 :(得分:2)
Peter Wright描述了主要技巧。
最后一个问题似乎是退出for循环而不会丢失值。
您可以使用GOTO :break
作为GOTO
立即停止所有循环。
无法在!newline!
块中使用ENDLOCAL
,因为这会在ENDLOCAL
之后展开,但随后会变空。
@ECHO off
setlocal EnableDelayedExpansion
for /F "delims=" %%a in (%1) do (
set "line=%%a"
set "newLine=!line:<Interface_status>=!"
set "newLine=!newLine:</Interface_status>=!"
if "!newLine!" neq "!line!" (
@echo Status is !newLine!
goto :break
)
)
(
endlocal
set "%~2=%newLine%"
)
如果你在newLine中的值可能包含引号,那么最好使用一种更安全的技术:
for /F "delims=" %%a in ("!newline!") DO (
endlocal
set "%~2=%%~a"
)