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。
错误???
答案 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%""