SET var=%6 IF NOT "%var%"=="" ( @ECHO "ijklkmn" EXIT IF %var:~-2,1%== SET var=%var:~0,-2%" )
如果未定义%6 ,则不执行@ECHO "ijklkmn" 。 但为什么我还是There should be no 1var:~0。 ?
windowsbatch file中的date分析
批号variables设置器
使用windows Batch比较3对XML文件
批文件复制文件
如何在使用SETLOCAL时持久地将目录添加到PATH?
有几个批次的复杂性导致您的问题。
1)括号化的块在一次传递中被解析。 在执行IF测试之前,您的整个IF块必须解析为有效的语法。
2)如果变量未定义,子字符串扩展会造成奇怪的事情。 解析器将%var:扩展为空,留下子字符串表达式的其余部分,并且行解析变得完全不同步。
IF %var:~-2,-2%"
首先%var:展开为IF ~-2,-2%" ,留下IF ~-2,-2%"
接下来%== SET var=%被扩展为IF ~-2,1var:~0,-2%"
最后,孤独%没有配对,因此被剥离。
扩展后的最后一行现在是IF ~-2,-2" ,这是无效的语法。
有关%扩展如何工作的详细说明,请参阅https://stackoverflow.com/a/7970912/1012053 。
你的代码可以通过2个非直观的改变来“固定”:1)颠倒比较顺序,2)在SET语句周围添加转义引号,3)添加一些额外的文本:
if ""=="%var:~-2,1%" SET ^"var=%var:~0,-2%"^" ignore
如果var是未定义的,则上面展开为:
if "" == "~-2,-2"" ignore
重要的是解析的语法是有效的。 ignore是必要的,因为IF语句在条件之后需要一个命令,以便解析器将其视为有效。 如果执行,会导致错误,因为ignore不是有效的命令。 但是它永远不会被执行,因为条件是FALSE(也是外部IF条件也是假的)。
如果定义了var,比如说"test"的值,那么就像你想象的那样展开该行:
if "" == "" SET "var=test" ignore
上面的执行完全是因为SET赋值的引用方式。 最后的报价之后的任何内容都将被忽略。
我说上面的代码会“修复”你的代码,但我相信有很多更好的方法来完全重构你的代码。
更新:重组建议
它在我看来,就好像你只是想设置一个变量的引用参数的值,如果值(不包括引用)中的最后一个字符是 ,然后删除该字符。 它看起来像你也有一些测试代码插入来尝试诊断为什么你的代码不工作。 放弃测试代码,我建议如下:
set var=%6 set "test=%var:~-2,1%" if "%test%"=="" set var=%var:~0,-2%"
我了解如何引用文件名和路径来保留空格。 但我不喜欢在我的变量值中包含引号。 我喜欢从我的参数中去除封闭的引号,然后只在需要的时候将它们添加回去。 所以我的代码看起来像:
set "var=%~6" set "test=%var:~-1,1%" if "%test%"=="" set "var=%var:~0,-1%"
如果启用延迟扩展,那么简单的解决方案不再需要测试变量:
set var=%6 setlocal enableDelayedExpansion if "!var:~-2,1!"=="" set "var=!var:~0,-2!""
或者如果剥离封闭的报价:
set "var=%~6" setlocal enableDelayedExpansion if "!var:~-1,-1!"
我会建议使用defined的扩展能力和dbenham所说的一切。
@ECHO off SET "var=%6" IF NOT defineD var ( ECHO "ijklkmn" EXIT ) IF "%var:~-2,1%"=="" SET "var=%var:~0,-2%""
总结以上是内存溢出为你收集整理的如果声明甚至批条件是错误的全部内容,希望文章能够帮你解决如果声明甚至批条件是错误的所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)