我在弄清楚为什么我的.bat文件随机关闭时遇到了很多麻烦......但我已将其缩小到这个范围:
IF %var:~-1%==\ SET var=%var:~0,-1%
IF %var:~0,1%==\ SET var=%var:~1%
理想情况下,我最终要完成的任务是删除%var%
中由用户输入设置的任何前导或尾部斜杠或反斜杠。
以上几行有效,但在设置IF
时setlocal 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
我知道启用延迟扩展后,我必须使用!
代替%
来获取变量,但我已尝试在这些线路上的每种组合都无济于事,并且我不明白他们的工作方式是否足以进一步排除故障。
如果有更有效的方式来完成我所描述的内容,请务必提及它。批量写作我有点新鲜。
答案 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!
参数周围的参数确保变量不会获取任何杂散尾随空格可能存在于指令行上。