- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在循环中保留 endlocal
之后的多个变量(具有特定前缀)?
变量在循环声明中可见,但在循环体中不可见。
这是一个使用 echo
而不是变量赋值的示例,以说明变量在 for
主体中不可见。通常,变量赋值会代替 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之前打印正常,但在endlocal之后打印不出来。
有没有办法像这样保存过去的endlocal变量?
最佳答案
鉴于您的示例代码,我认为您要问的是“如何在 endlocal 之后设置动态变量数?”您的要求不是很直观,但 是可能的。将 set
与 endlocal
复合时,不能使用延迟扩展。通常可以采用一种变通方法,使用 for
循环到 endlocal & set "var=%%A"
,这仅在变量和值的数量是静态的情况下才有效。不幸的是,endlocal & for
与 for...in...do (endlocal & set)
的工作方式不同,您肯定会在您的自己测试。
我的解决方案是在 endlocal
之后使用宏进行设置——基本上是将 commands 而不是简单的字符串值放入变量中,然后将该变量作为一组 set
命令。
@echo off
setlocal
:: // call ":set" subroutine to do the setting
call :set
:: // display results
set subv
:: // end main runtime
goto :EOF
:: // :set subroutine
:set
setlocal enabledelayedexpansion
:: // any number of variables prefixed by "subv"
set "subv1=1"
set "subv2=2"
set "subv3=3"
:: // init %compound%
set compound=
:: // combine all %subvX% variables into a macro of set var1=val1 & set var2=val2, etc
for /f "delims=" %%I in ('set subv') do set "compound=!compound! & set "%%~I""
:: // evaluate set commands as a macro
endlocal & %compound:~3%
goto :EOF
另一个解决方案是回到我提到的第一个解决方法,格式为 endlocal & set "var=%%A"
。通常这只在你知道你只会循环一次时使用,比如
for %%I in ("!var!") do endlocal & set "return=%%~I"
...因为您不想结束本地化太多次。但是您可以通过使用 if not defined
像这样使用单个 endlocal
执行多值循环:
@echo off
setlocal
call :set
set subv
goto :EOF
:set
setlocal enabledelayedexpansion
set "subv1=1"
set "subv2=2"
set "subv3=3"
set end=
for /f "delims=" %%I in ('set subv') do (
if not defined end endlocal & set end=1
set "%%~I"
)
goto :EOF
... 并且因为 endlocal
和 set "%%~I"
包含在带括号的代码块中,变量被重新设置并且您的目标实现了.
关于batch-file - 在循环中分配超过 endlocal 的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28682268/
我正在尝试设置 SETLOCAL 内部、FOR 循环内部和 IF 语句内部的变量的值。然而,它似乎永远不会奏效。我尝试在 ENDLOCAL 语句中使用 SET 语句,但这似乎并没有实际设置任何内容。之
我在批处理脚本中有以下“功能”: :myfunction setlocal set _variable=%* :: do something with %_variable%
我有一个批处理文件,它通过一系列中间变量计算变量: @echo off setlocal set base=compute directory set pkg=compute sub-director
如何在循环中保留 endlocal 之后的多个变量(具有特定前缀)? 变量在循环声明中可见,但在循环体中不可见。 这是一个使用 echo 而不是变量赋值的示例,以说明变量在 for 主体中不可见。通常
如何在循环中保留 endlocal 之后的多个变量(具有特定前缀)? 变量在循环声明中可见,但在循环体中不可见。 这是一个使用 echo 而不是变量赋值的示例,以说明变量在 for 主体中不可见。通常
目标 将环境变量更改隔离到代码块。 背景 如果我想创建一个批处理脚本来运行需要设置环境变量的命令,我知道我可以这样做: setlocal set MYLANG=EN my-cmd dostuff -o
我有一个文件夹结构,例如C:\Temp\,里面有很多文件夹和文件,每个文件夹里都有一个“callme.bat”。我想创建一个所谓的 main.bat,它在主窗口中一个接一个地调用 callme 文件。
我有一个通过引用批量返回值的函数。 :errorCheck setlocal set "test_command=%~1" set "err_code=%~2" FOR /F "delims=" %%
我有一段代码正在执行 0-100,000 次。有问题的 block 显示如下: FOR /R %%f IN (*.*) DO ( CLS ECHO Del 2.0 ECHO Files D
这里有两个批处理文件:1.bat,setenv.bat 1.bat: 调用setenv.bat 回显%var% setenv.bat: setlocal ENABLEDELAYEDEXPANSION
解析架构后需要更好的错误报告,即 enum MyEnum { Key1, Key2, Key3 } table Test { field1: MyEnum = MyEnum.Key1;
我是一名优秀的程序员,十分优秀!