【发布时间】:2019-06-21 11:34:31
【问题描述】:
我有一个文件夹结构,例如 C:\Temp\,有很多文件夹和文件,每个文件夹中都有一个“callme.bat”。我想创建一个所谓的 main.bat,它在主窗口中一个接一个地调用 callme 文件。但是有一个问题,在 callme 文件中有一些包含“!”的回声。标记对我来说是什么问题。
我意识到 setlocal-endlocal 组合的问题,因为批处理脚本想要解释“!”中的消息标记,所以我必须使用 endlocal,但如果我这样做了,我就无法运行 callme bats。
callme.bat
@echo off
echo !!! hidden message !!! not hidden message
pause
main.bat 变体 1
@echo off
setlocal enabledelayedexpansion
set PATH=C:\Temp
for /F %%x in ('dir /B/A:D %PATH%') do (
set CURR_DIR=%PATH%\%%x
set ACTUAL_BATCH=!CURR_DIR!\callme.bat
echo !ACTUAL_BATCH!
call !ACTUAL_BATCH!
pause
)
pause
exit
main.bat 变体 2
@echo off
set PATH=C:\Temp
for /F %%x in ('dir /B/A:D %PATH%') do (
setlocal enabledelayedexpansion
set CURR_DIR=%PATH%\%%x
set ACTUAL_BATCH=!CURR_DIR!\callme.bat
echo !ACTUAL_BATCH!
ENDLOCAL & SET VAR=!ACTUAL_BATCH!
echo %VAR%
pause
)
pause
exit
main.bat 变体 3
@echo off
set PATH=C:\Temp
for /F %%x in ('dir /B/A:D %PATH%') do (
setlocal enabledelayedexpansion
set CURR_DIR=%PATH%\%%x
set ACTUAL_BATCH=!CURR_DIR!\callme.bat
echo !ACTUAL_BATCH!
REM source: https://stackoverflow.com/questions/3262287/make-an-environment-variable-survive-endlocal
for /f "delims=" %%A in (""!ACTUAL_BATCH!"") do endlocal & set "VAR=%%~A"
echo %VAR%
call %VAR%
pause
)
pause
exit
所以我不知道该怎么办。有人有想法吗?
变体 1 的输出:
C:\Temp\1\callme.bat
not hidden message
C:\Temp\2\callme.bat
not hidden message
变体 2-3 的输出:
C:\Temp\1\callme.bat
ECHO is off.
C:\Temp\2\callme.bat
ECHO is off.
【问题讨论】:
-
请不要重新定义
%PATH%,它是一个非常重要的系统变量,请在您的每个.bat文件中更改其名称。 -
你不需要使用延迟扩展甚至
Set。单行脚本应该可以正常工作,@For /F "Delims=" %%A In ('Dir /B/AD "C:\Temp" 2^>NUL')Do @Call "%%~fA\callme.bat" 2>NUL,或者,@For /D %%A In ("C:\Temp\*")Do @Call "%%~fA\callme.bat" 2>NUL。
标签: windows batch-file cmd delayedvariableexpansion