在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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)