gpt4 book ai didi

windows - 从 setlocal 代码中传递变量

转载 作者:可可西里 更新时间:2023-11-01 10:04:58 24 4
gpt4 key购买 nike

在 Windows 批处理文件中编写脚本时,有时脚本的正确执行需要使用 setlocal 命令。我对使用 setlocal 的主要提示是,我经常执行复杂的 for & if 语句,在这些语句中我在该代码部分设置了变量值。当我发出命令 endlocal 时,这些设置丢失了。

到目前为止,我已经解决了这个问题,方法是将变量值回显到 setlocal 段中的临时文件中,然后在 endlocal 之后将值读回变量中.然而,似乎应该有一个更优雅的解决方案来解决这个问题。

如果仅使用一个或多个 set 语句,建议的答案提供了一种规避问题的简便方法。但是,当 setlocal 到位以允许 for 循环在执行时而不是解析时正确扩展变量名时,链接的答案没有提供解决方案。在我的情况下,我还有 if 语句逻辑树来进一步检查该信息以设置许多不同的可能变量值。链接的解决方案没有针对这种情况提供解决方案。

这段代码应该检查安装包的版本号。它是从另一个需要该版本号才能正常运行的脚本调用的。我们知道该包使用 [应用程序][版本号].msi 的形式命名。 [版本号] 可以是以下任何一个:

  • 7
  • 7.5
  • 9
  • 9.5
  • 10
  • 10.1

指定目录中可能存在多个安装包,因此务必查看所有安装包并选择目录中的最高版本。

我继承并扩展了代码以正确处理 10 和 10.1 版本。如果在没有 setlocal 的情况下有更好的方法来执行此操作(例如,我考虑过重写以使用 case 语句),我很乐意看到更好的解决方案。

但是,我仍然对学习如何将变量传递出 setlocal/endlocal 段很感兴趣。

setlocal enabledelayedexpansion

for /f %%a in ('dir /b program*.MSI') do (
set FileName=%%a
set tst1=!FileName:~4,3!
if "!tst1!" == "msi" (
rem Only true if it has a 1 digit number (e.g. "9")
set MAIN_VERSION=!FileName:~2,1!
) else (
set tst2=!FileName:~5,3!
if "!tst2!" == "msi" (
rem Only true if it has a 2 digit version number (e.g. "10")
set MAIN_VERSION=!FileName:~2,2!
) else (
... lots more code ...
)
)
)
rem Write results out to a file for temporary storage. This particular
rem form of echo is required to ensure there are no trailing spaces, CR,
rem or LF
echo|set /P ="!MAIN_VERSION!" > %USERPROFILE%\UGV.txt

rem End local variables
endlocal

rem Read the correct version out of our temporary storage file
set /p MAIN_VERSION=<%USERPROFILE%\UGV.txt

如何从 Windows 批处理脚本 setlocal/endlocal 代码段中传递变量(例如上面的 MAIN_VERSION)不使用暂存文件?

最佳答案

要在 setlocal/endlocal 范围内保留变量,存在不同的解决方案。

具体情况看你用哪个。

1) 简单

仅在括号外内容简单的 block 有效,但会产生特殊字符问题,如 !^"

setlocal 
set localVar=something simple
...
(
endlocal
set "out=%localVar%"
)
set out

2) 中等

也可以在 block 中工作,可以处理最多的字符,但可能会因 !^ 和换行/回车而失败

if 1==1 (
setlocal EnableDelayedExpansion
set "localVar=something medium nasty & "^&"

for /F "delims=" %%V in ("!localVar!") DO (
endlocal
set "out=%%V"
)
)
set out

3) 进阶

适用于任何情况下的所有内容
SO: preserving exclamation marks in variable between setlocals batch

关于windows - 从 setlocal 代码中传递变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33898076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com