【问题标题】:Removing leading/trailing slashes in .BAT file ruins everything删除 .BAT 文件中的前导/尾随斜杠会破坏一切
【发布时间】:2018-07-28 14:47:44
【问题描述】:

我很难弄清楚为什么我的 .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

我知道,当启用延迟扩展时,我必须使用 ! 而不是 % 作为变量,但我已经尝试了这些行中的所有组合都无济于事,我不明白如何他们的工作足以进一步排除故障。

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

【问题讨论】:

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


    【解决方案1】:

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

    delayedexpansion 被调用时,

    %var% 指的是var 的值,因为它是任何code block(括号中的指令序列)遇到(实际上,var 只是简单地替换为 它当时的值然后执行指令)

    !var!指的是varrun-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,因此它“崩溃”了,因为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 操作更改。

    但是,set/p 不会 清除变量,如果您只是按 Enter。它使变量 unchanged (但它的值在当时恰好是 nothing

    因此,更好的方法是

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

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

    【讨论】:

    • 太棒了,谢谢!我曾尝试用! 替换所有%,但我没有尝试添加引号。效果很好。
    猜你喜欢
    • 2012-05-11
    • 2012-06-06
    • 2019-01-25
    • 2011-02-20
    • 2021-12-25
    • 2012-01-17
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    相关资源
    最近更新 更多