删除 .BAT 文件中的 leading/trailing 个斜杠会破坏一切
Removing leading/trailing slashes in .BAT file ruins everything
我很难弄清楚为什么我的 .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
我知道当启用延迟扩展时,我必须使用 !
而不是 %
作为变量,但我已经尝试了这些行上的所有组合都无济于事,并且我不明白他们如何工作以进一步排除故障。
如果有更有效的方法来完成我所描述的,请务必提及。我对批量写入有点陌生。
正如您所暗示的,问题的关键在于使用 delayed expansion
。
当delayedexpansion
被调用时,
%var%
指的是 var
的值,因为它是 code block
(带括号的指令序列)遇到(实际上, var
只是被 替换为当时的值 然后执行指令)
!var!
指的是 var
的 run-time 值 - 即当前时间的值,可能已被更改通过 code block
.
的操作
所以,检查你的代码
set /p var="-> "
IF %var:~-1%==\ SET var=%var:~0,-1%
IF %var:~0,1%==\ SET var=%var:~1%
echo !var!
这是执行作为
set /p var="-> "
IF ==\ SET var=
IF ==\ SET var=
echo !var!
因为代码开头 var
的值是 nothing,因此 "crashes" 因为 if
语句语法是不正确。
要解决此问题,请使用
set /p var="-> "
IF !var:~-1!==\ SET var=!var:~0,-1!
IF !var:~0,1!==\ SET var=!var:~1!
echo !var!
其中对 var
的每个引用都变成值 ,由 "set /p" 或后续 set
操作更改。
但是,如果您只需按 Enter,set/p
不会 清除变量。它让变量保持不变(但它的值恰好是nothing)
因此,更好的方法是
set /p var="-> "
IF "!var:~-1!"=="\" SET "var=!var:~0,-1!"
IF "!var:~0,1!"=="\" SET "var=!var:~1!"
echo !var!
if
参数周围的引号确保参数不是 空 而 set
参数周围的引号确保变量不获取指令行中可能存在的任何杂散尾随空格。
我很难弄清楚为什么我的 .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
我知道当启用延迟扩展时,我必须使用 !
而不是 %
作为变量,但我已经尝试了这些行上的所有组合都无济于事,并且我不明白他们如何工作以进一步排除故障。
如果有更有效的方法来完成我所描述的,请务必提及。我对批量写入有点陌生。
正如您所暗示的,问题的关键在于使用 delayed expansion
。
当delayedexpansion
被调用时,
%var%
指的是 var
的值,因为它是 code block
(带括号的指令序列)遇到(实际上, var
只是被 替换为当时的值 然后执行指令)
!var!
指的是 var
的 run-time 值 - 即当前时间的值,可能已被更改通过 code block
.
所以,检查你的代码
set /p var="-> "
IF %var:~-1%==\ SET var=%var:~0,-1%
IF %var:~0,1%==\ SET var=%var:~1%
echo !var!
这是执行作为
set /p var="-> "
IF ==\ SET var=
IF ==\ SET var=
echo !var!
因为代码开头 var
的值是 nothing,因此 "crashes" 因为 if
语句语法是不正确。
要解决此问题,请使用
set /p var="-> "
IF !var:~-1!==\ SET var=!var:~0,-1!
IF !var:~0,1!==\ SET var=!var:~1!
echo !var!
其中对 var
的每个引用都变成值 ,由 "set /p" 或后续 set
操作更改。
但是,如果您只需按 Enter,set/p
不会 清除变量。它让变量保持不变(但它的值恰好是nothing)
因此,更好的方法是
set /p var="-> "
IF "!var:~-1!"=="\" SET "var=!var:~0,-1!"
IF "!var:~0,1!"=="\" SET "var=!var:~1!"
echo !var!
if
参数周围的引号确保参数不是 空 而 set
参数周围的引号确保变量不获取指令行中可能存在的任何杂散尾随空格。