有一些批次的复杂性会导致您的问题。
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!"