Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 在循环中指定超过endlocal的变量_Batch File - Fatal编程技术网

Batch file 在循环中指定超过endlocal的变量

Batch file 在循环中指定超过endlocal的变量,batch-file,Batch File,如何在一个循环中保留超过endlocal的许多变量(带有特定前缀) 变量在循环声明中可见,但在正文中不可见 下面是一个使用echo代替变量赋值的示例,以说明变量在主体的中不可见。通常情况下,变量赋值将代替echo: @echo off setlocal ENABLEDELAYEDEXPANSION set TB_1=test1 set TB_2=test2 set TB_ALL_VARS= for /F "tokens=1 delims==" %%x in ('set TB_') do (

如何在一个循环中保留超过
endlocal
的许多变量(带有特定前缀)

变量在循环声明中可见,但在正文中不可见

下面是一个使用
echo
代替变量赋值的示例,以说明变量在
主体的
中不可见。通常情况下,变量赋值将代替echo

@echo off

setlocal ENABLEDELAYEDEXPANSION
set TB_1=test1
set TB_2=test2

set TB_ALL_VARS=
for /F "tokens=1 delims==" %%x in ('set TB_') do (
  set TB_ALL_VARS=%%x !TB_ALL_VARS!
)

for %%x in (%TB_ALL_VARS%) do ( echo %%x = !%%x! ) 
echo END LOCAL
endlocal & ( for %%x in (%TB_ALL_VARS%) do ( echo %%x = !%%x! ) )
输出:

TB_2 = test2
TB_1 = test1
END LOCAL
TB_2 = !TB_2!
TB_1 = !TB_1!
如您所见,变量在endlocal之前打印为ok,但在endlocal之后不打印

有没有一种方法可以保存像这样的变量,比如说过去的endlocal?

您正在尝试使用,但是在endlocal之后您不能使用
以展开变量。请尝试以下操作:

@echo off

setlocal ENABLEDELAYEDEXPANSION
set TB_1=test1
set TB_2=test2

set TB_ALL_VARS=
for /F "tokens=1 delims==" %%x in ('set TB_') do (
  set TB_ALL_VARS=%%x !TB_ALL_VARS!
)

for %%x in (%TB_ALL_VARS%) do ( echo %%x = !%%x! ) 
echo END LOCAL
endlocal & ( for %%x in (%TB_ALL_VARS%) do ( call echo %%x = %%%%x%% ) )


对于您的示例代码,我认为您要问的是,“如何在endlocal之后设置动态数量的变量?”您所问的不是非常直观,但这是可能的。使用
endlocal
组合
set
时,不能使用延迟扩展。通常可以采用一种变通方法,将
for
循环用于
endlocal&设置“var=%%A”
,该方法仅在变量和值的数量为静态时有效。不幸的是,
endlocal&for
for的工作原理不同。。。在里面执行(endlocal&set)
,这无疑是您在自己的测试中发现的

我的解决方案是使用宏在
endlocal
之后进行设置——基本上是将命令而不是简单的字符串值放入变量中,然后将该变量作为一组
set
命令进行计算

@echo关闭
setlocal
://调用“:set”子例程进行设置
通话:设定
://显示结果
集合subv
://结束主运行时
后藤:EOF
:/:设置子例程
:设置
延迟扩展
://前缀为“subv”的任意数量的变量
设置“subv1=1”
设置“subv2=2”
设置“subv3=3”
:://初始化%component%
固定化合物=
:://将所有%subvX%变量组合成set var1=val1和set var2=val2等的宏
对于/f“delims=“%%I in('set subv')do set”component=!component!&set“%%~I”
://将集合命令作为宏进行求值
endlocal和%Component:~3%
后藤:EOF

另一个解决方案是返回到我提到的第一个解决方案,格式为
endlocal&set“var=%%A”
。通常,只有在知道只循环一次时才使用此选项,例如

对于(“!var!”)中的%%I,执行endlocal并设置“return=%%~I”
。。。因为你不想结束太多次。但是,如果未定义,您可以使用单个
endlocal
执行多值循环,如下所示:

@echo关闭
setlocal
通话:设定
集合subv
后藤:EOF
:设置
延迟扩展
设置“subv1=1”
设置“subv2=2”
设置“subv3=3”
结束=
对于/f“delims=“%%I in('set subv')do(
如果未定义end endlocal&设置end=1
设置“%%~I”
)
后藤:EOF
。。。由于
endlocal
set“%%~I”
包含在一个附加代码块中,因此变量被重新设置,您的目标就实现了

@echo off

setlocal ENABLEDELAYEDEXPANSION
set TB_1=test1
set TB_2=test2

set TB_ALL_VARS=
for /F "tokens=1 delims==" %%x in ('set TB_') do (
  set TB_ALL_VARS=%%x !TB_ALL_VARS!
)

for %%x in (%TB_ALL_VARS%) do ( echo %%x = !%%x! ) 
echo END LOCAL
endlocal & ( for %%x in (%TB_ALL_VARS%) do (
 setlocal enableDelayedExpansion
 call echo %%x = !%%x! )
 endlocal 
 )