删除.BAT文件中的前导/尾部斜杠会破坏一切

时间:2018-02-18 02:53:54

标签: windows batch-file command-line batch-processing

我在弄清楚为什么我的.bat文件随机关闭时遇到了很多麻烦......但我已将其缩小到这个范围:

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

理想情况下,我最终要完成的任务是删除%var%中由用户输入设置的任何前导或尾部斜杠或反斜杠。

以上几行有效,但在设置IFsetlocal EnableDelayedExpansion语句内部以及IF语句中也设置了变量时不行。

例如,如果删除上面的行,则以下内容有效,否则会崩溃:

@echo off
setlocal EnableDelayedExpansion
set somevar=blah
if !somevar!==blah (
    set /p var="-> "
    IF %var:~-1%==\ SET var=%var:~0,-1%
    IF %var:~0,1%==\ SET var=%var:~1%
    echo !var!
)
pause

但是,如果我删除IF条件,它确实有效:

@echo off
setlocal EnableDelayedExpansion
set /p var="-> "
IF %var:~-1%==\ SET var=%var:~0,-1%
IF %var:~0,1%==\ SET var=%var:~1%
echo !var!
pause

如果我保留IF声明,但将set /p var="-> "移到它之外,那么它也有效:

@echo off
setlocal EnableDelayedExpansion
set somevar=blah
set /p var="-> "
if !somevar!==blah (
    IF %var:~-1%==\ SET var=%var:~0,-1%
    IF %var:~0,1%==\ SET var=%var:~1%
    echo !var!
)
pause

我知道启用延迟扩展后,我必须使用!代替%来获取变量,但我已尝试在这些线路上的每种组合都无济于事,并且我不明白他们的工作方式是否足以进一步排除故障。

如果有更有效的方式来完成我所描述的内容,请务必提及它。批量写作我有点新鲜。

1 个答案:

答案 0 :(得分:1)

正如您所暗示的,问题的关键是使用delayed expansion

调用delayedexpansion

%var%指的是var的值,就像任何code block(带括号的指令序列)遇到时一样(实际上,{{1}只需用当时的值替换,然后执行指令)

var指的是!var!运行时值 - 也就是当前时间的值,可能已被{{的操作改变了1}}。

所以,检查你的代码

var

这是执行

code block

因为代码开头的set /p var="-> " IF %var:~-1%==\ SET var=%var:~0,-1% IF %var:~0,1%==\ SET var=%var:~1% echo !var! 的值是 nothing ,因此它“崩溃”,因为set /p var="-> " IF ==\ SET var= IF ==\ SET var= echo !var! 语句语法不正确。

要解决此问题,请使用

var

其中对if的每次引用都变为由“set / p”或后续set /p var="-> " IF !var:~-1!==\ SET var=!var:~0,-1! IF !var:~0,1!==\ SET var=!var:~1! echo !var! 操作更改的值

但是,如果您只需按 Enter var 就不会清除变量。它使变量保持不变(但当时它的值恰好是 nothing

因此,更好的方法是

set

其中set/p参数周围的引号确保参数不是为空,而set /p var="-> " IF "!var:~-1!"=="\" SET "var=!var:~0,-1!" IF "!var:~0,1!"=="\" SET "var=!var:~1!" echo !var! 参数周围的参数确保变量不会获取任何杂散尾随空格可能存在于指令行上。