从setlocal代码中传递variables

从setlocal代码中传递variables,第1张

概述从setlocal代码传递variables

在windowsbatch file中编写脚本时,有时脚本的正确执行需要使用setlocal命令。 我关于使用setlocal主要抱怨是,我经常在&if语句中执行复杂的 *** 作,在该代码段中设置variables值。 当我发出命令endlocal时,这些设置会丢失。

到目前为止,我已经通过将variables值回显到setlocal段内的临时文件中,然后在endlocal之后将值读回variables中来解决此问题。 但是,似乎应该有一个更加优雅的解决scheme来解决这个问题。

build议的答案提供了一个方便的方法来绕过这个问题,如果只使用一个或多个set语句。 但是,当setlocal就位时,链接的答案不提供解决scheme,以允许for循环在执行时正确扩展variables名称而不是parsing。 在我的情况下,我也有if语句逻辑树进行进一步检查的信息,以set许多不同的可能的variables值。 链接的解决scheme不能解决这种情况。

这段代码应该检查安装包的版本号。 它从另一个脚本调用,要求版本号才能正常工作。 我们知道这个包是用[application] [version number] .msi的forms命名的。 [版本号]可以是以下任何一个:

如何将批处理脚本的输出打印到不影响其在脚本上显示的文件

batch file以pipe理员身份自动运行

检测 *** 作系统批次

Intellij stdin重build

batch file用于在文件前添加随机数字(3位数字)并删除数字

7

7.5

9

9.5

10

10.1

在指定目录中可能存在多个安装包,因此查看所有目录并select目录中的最高版本非常重要。

我inheritance并扩展了代码,以正确处理10和10.1版本。 如果没有setlocal的话,有更好的方法可以做到这一点(例如我曾经想过重写使用case语句),我很乐意看到更好的解决scheme。

不过,我仍然对学习如何将variables传递给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 (eg "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 (eg "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代码段中传递variables(如上面的MAIN_VERSION )而不使用临时文件?

cmd编程中的速度和时间问题

批处理脚本返回文件的path

检测batch file的执行方式

如何禁用windows平台上的JVM以运行背景matlab脚本

使用batch file索引E: data下的所有文件和文件夹

为了保留setlocal / endlocal作用域上的变量,存在不同的解决方案。

这取决于你应该使用的情况。

1)简单

只使用简单内容的括号块外部 ,但可以产生特殊字符,如!^" 。

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

2)中等

作品也在块,并可以处理大多数字符,但可以失败!^和换行/回车

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:在setlocals批次之间保留变量中的感叹号

总结

以上是内存溢出为你收集整理的从setlocal代码中传递variables全部内容,希望文章能够帮你解决从setlocal代码中传递variables所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1274121.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-08
下一篇 2022-06-08

发表评论

登录后才能评论

评论列表(0条)

保存