1
4

2 回答 2

2

有一些批次的复杂性会导致您的问题。

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

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

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

First%var:扩展为空,留下IF ~-2,1%==\ SET var=%var:~0,-2%"
Next%==\ SET var=%扩展为空,离开IF ~-2,1var:~0,-2%"
Final,孤%没有配对,所以被剥离。
展开后的最后一行是 now 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!"
于 2013-01-23T05:16:19.457 回答
1

我建议使用扩展能力defineddbenham所说的一切。

@ECHO off
SET "var=%6"
IF NOT DEFINED var (
    ECHO "ijklkmn"
    EXIT
)
IF "%var:~-2,1%"=="\" SET "var=%var:~0,-2%""
于 2013-01-23T15:04:46.153 回答