windows - 批量条件错误也执行if语句

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

最佳答案

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

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

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

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

第一个 %var: 展开为空,剩下 IF ~-2,1%==\SET var=%var:~0,-2%"< br/> 接下来 %==\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 不是有效命令。但它永远不会被执行,因为条件为假(而且外部 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!"

关于windows - 批量条件错误也执行if语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14469450/

相关文章:

batch-file - 如何删除只有4个字符的文件?

powershell - 如何找出 CMD.exe 进程在远程机器上运行的脚本?

python - os.path.expanduser ("~"的替代方案)?

windows - Docker 无法在 Windows 10 中运行

c - Microsoft 编译器宏扩展空间问题

c# - 如何获取 UserName/My Pictures 文件夹的目标路径?

c - 功能是打印我的字符远离它应该在的地方

Windows 中的 Python os.mknod

windows - Microsoft 将 TraceDmp 工具/源隐藏在哪里?

windows - 批量打码启动命令错误