即使批处理条件错误,也会执行if语句

时间:2013-01-22 22:44:23

标签: windows windows-7 batch-file

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。错误???

2 个答案:

答案 0 :(得分:2)

有一些批处理复杂性导致您的问题。

1)在一遍中解析带括号的块。在执行IF测试之前,整个IF块必须解析为有效的语法。

2)如果变量未定义,子串扩展会发生奇怪的事情。解析器将%var:扩展为空,留下子串表达式的其余部分,并且行解析变得完全不同步。

IF %var:~-2,1%==\ SET var=%var:~0,-2%"

首先%var:展开为空,留下IF ~-2,1%==\ SET var=%var:~0,-2%" 下一个%==\ SET var=%展开为空,留下IF ~-2,1var:~0,-2%" 最后,单独的%未配对,因此被剥离 扩展后的最后一行现在是IF ~-2,1var:~0,-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,1var:~0,-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!"=="\" set "var=!var:~0,-1!"

答案 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%""