windows 如何测试SETLOCAL ENABLEDELAYEDEXPANSION是否处于活动状态

epggiuax  于 2023-05-08  发布在  Windows
关注(0)|答案(2)|浏览(148)

在我的用例中,我有一个scriptMain.bat调用scriptSub.bat
在调用的scriptSub.bat中,需要启用DelayedExpansion
由于我必须与scriptMain.batscriptSub.bat共享变量设置(更新于2023年5月5日:我不想通过调用参数引用共享设置,因为scriptSub.bat进行的设置数量太多),在调用scriptSub.bat之前,必须在scriptMain.bat中执行SETLOCAL ENABLEDELAYEDEXPANSION命令。
所以我想检查scriptSub.bat,如果DelayedExpansion实际上是ON的。
我确实像这样实现了这些脚本--而且看起来很有效,但我想知道是否有更简单的解决方案可用。
scriptMain.bat

@ECHO OFF
REM scriptMain.bat for both cases:
SETLOCAL ENABLEDELAYEDEXPANSION
CALL scriptSub.bat
ENDLOCAL

REM Now without ENABLEDELAYEDEXPANSION
SETLOCAL
CALL scriptSub.bat
ENDLOCAL

scriptSub.bat

REM scriptSub.bat:
SET "_var1=val1" & SET "_var2=!_var1!"

IF "%_var1%" == "%_var2%" (
  ECHO Delayed expansion is ON
)  ELSE (
  ECHO Delayed expansion is OFF
)
GOTO:EOF

执行scriptMain.bat的输出:

Delayed expansion is ON
Delayed expansion is OFF
mqxuamgl

mqxuamgl1#

不如

@ECHO OFF
SET "_dest=somewhere"&GOTO !_dest!

:!_dest!
ECHO delayedexpansion NOT enabled
GOTO :EOF

:somewhere
ECHO delayedexpansion IS enabled
GOTO :EOF
fdbelqdn

fdbelqdn2#

也许你试图解决错误的问题。
您搜索延迟扩展模式的检测,但您应该解决这个问题,即调用的批处理文件可以返回值或变量,而无需调用者准备一些东西。
解决方案可能是返回setlocal范围外的变量的各种技术之一

main.bat

@echo off
set "var="
call child.bat
echo The content of var:
set var

child.bat

@echo off
setlocal EnableDelayedExpansion
set temp=!time!

(
  endlocal
  set "var=%temp%"
)

或用于更复杂的内容

child.bat

@echo off
setlocal EnableDelayedExpansion
set "temp=;Docs&"Programs^&"..."

for /F "tokens=*" %%a in (""!temp!"") do (
  endlocal
  set "var=%%~a"
)

相关问题