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

Windows 删除.BAT文件中的前导/尾随斜杠会破坏一切,windows,batch-file,command-line,batch-processing,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%中的任何前导或尾随斜杠或反斜杠,这是由用户输入设置的 当设置了setlocal EnableDelayedExpansion且变量也在IF语句中设置时,上述行不起作用,但在IF语句中不起作用 例如,如果我删除了上面的行,则以下操作有效,否则将崩溃:

我很难弄清楚为什么我的.bat文件会随机关闭。。。但我把范围缩小到:

IF %var:~-1%==\ SET var=%var:~0,-1%
IF %var:~0,1%==\ SET var=%var:~1%
理想情况下,我最终要做的是删除
%var%
中的任何前导或尾随斜杠或反斜杠,这是由用户输入设置的

当设置了
setlocal EnableDelayedExpansion
且变量也在
IF
语句中设置时,上述行不起作用,但在
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
我知道,当启用延迟扩展时,我必须使用
而不是变量的
%
,但我在这些行中尝试了所有组合,但都没有效果,我不明白它们是如何工作的,无法进一步排除故障


如果有更有效的方法来完成我所描述的,请务必提及。我对批处理编写有点陌生。

正如您所暗示的,问题的关键在于使用
延迟扩展

当调用了
delayedexpansion

%var%
是指当遇到任何
代码块
(括号内的指令序列)时,
var
的值(实际上,
var
在当时被其值替换,然后执行指令)

!瓦尔
指的是
var
的运行时值,即当前时间的值,可能已被
代码块的操作改变

因此,从代码中检查

set /p var="-> "
IF %var:~-1%==\ SET var=%var:~0,-1%
IF %var:~0,1%==\ SET var=%var:~1%
echo !var!
这是按以下方式执行的:

由于代码开头的
var
值为零,因此它会“崩溃”,因为
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
不会清除变量。它保持变量不变(但此时其值恰好为零)

因此,更好的方法是

set /p var="-> "
IF "!var:~-1!"=="\" SET "var=!var:~0,-1!"
IF "!var:~0,1!"=="\" SET "var=!var:~1!"
echo !var!

其中,
if
参数周围的引号确保参数不是空的,
set
参数周围的引号确保变量不会获取指令行上可能存在的任何多余尾随空格。

太棒了,谢谢!我试着用
替换所有
%
但我没有尝试添加引号。效果很好。
set /p var="-> "
IF "!var:~-1!"=="\" SET "var=!var:~0,-1!"
IF "!var:~0,1!"=="\" SET "var=!var:~1!"
echo !var!