首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在批结束后保持变量

在批结束后保持变量
EN

Stack Overflow用户
提问于 2019-06-21 11:34:31
回答 2查看 819关注 0票数 2

我有一个文件夹结构,类似于C:\Temp\并且有很多文件夹和文件,每个文件夹中都有一个"callme.bat“。我想要创建一个所谓的main.bat,它是一个接一个调用主窗口内的回调文件。但是有一个问题,在callme文件中有一些包含"!“的回波。记住是什么给我带来了麻烦。

我意识到了setlocal-endlocal组合的问题,因为批处理凭证希望在“!!”中解释消息。标记,所以我必须使用endlocal,但如果我这样做了,我不能运行呼叫蝙蝠。

callme.bat

代码语言:javascript
复制
@echo off
echo !!! hidden message !!! not hidden message
pause

main.bat变式1

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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

代码语言:javascript
复制
@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的产出:

代码语言:javascript
复制
C:\Temp\1\callme.bat
 not hidden message
C:\Temp\2\callme.bat
 not hidden message

变式2-3的产出:

代码语言:javascript
复制
C:\Temp\1\callme.bat
ECHO is off.
C:\Temp\2\callme.bat
ECHO is off.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-21 12:34:12

关于您的代码的一些要点:

  1. 不要使用PATH作为变量名,因为它破坏了用于搜索可执行文件的PATH变量。
  2. 使用扩展的SET语法set "varname=content"来避免训练空间的问题。
  3. 您只需要使用setlocal DisableDelayedExpansion禁用延迟扩展模式。
代码语言:javascript
复制
@echo off
setlocal EnableDelayedExpansion

set MY_PATH=C:\Temp
for /F %%x in ('dir /B/A:D %PATH%') do (
    set "CURR_DIR=%MY_PATH%\%%x"
    set "ACTUAL_BATCH=!CURR_DIR!\callme.bat"

    call :execute ACTUAL_BATCH
    pause
)
pause
exit /b

:execute ACTUAL_BATCH
set "batFile=!%~1!"
echo Calling !batFile!

setlocal DisableDelayedExpansion
call %batFile%
endlocal

exit /b
票数 2
EN

Stack Overflow用户

发布于 2019-06-21 11:41:15

TL;DR

代码语言:javascript
复制
ENDLOCAL&set "varname=%sourcevarname%"

可能,其中varname是要设置的变量名,而sourcevarname是要分配给varname的变量--即使语句在逻辑上为null,它们的也可以是相同的名称--它是从setlocal/endlocal块中导出变量。

关键点:必须在一条物理线路上,必要时可以重复(即

代码语言:javascript
复制
 ENDLOCAL&set "varname=%sourcevarname%"&set "varname2=%sourcevarname2%"

所以

代码语言:javascript
复制
 ENDLOCAL&set "fred=%fred%"&set "bill=%george%"

完全有效,将setlocal/endlocal括号外的fred值设置为其内部的最终值,将bill外部的值设置为george的最终值。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56702655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档