batch-file - 批处理 - 延迟扩展不适用于周围的 if 子句

标签 batch-file scripting windows-scripting

在下面的脚本中,我调用了一个带有字符串的子例程,该字符串的子字符串的最大长度和第三个不存在的变量来取回子字符串。

脚本应该检查具有最大子字符串长度的字符串之后的下一个字符是否是空格,如果是,则按该空格剪切字符串(删除空格)并返回子字符串并通过剪切更改传递的字符串子串部分。示例:

字符串:"Hello World Bla"
子串长度:5

CALL :get_substring string substringLength 子串

=> string: "World Bla"(无空格), substringLength: 5 (no change), substring: "Hello"

这在没有 if 子句的情况下工作正常,但当我使用 if 子句时它不起作用,即使我使用延迟扩展也是如此。

这是没有 if 语句的工作代码:

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
    SET string=Hello World wasserschutzpolizei
    SET /A substringLength=5
    CALL :get_substring string substringLength substring
    ECHO !string!
    ECHO !substring!
    EXIT /B 0
ENDLOCAL

:get_substring
    SETLOCAL ENABLEDELAYEDEXPANSION

    SET "string=!%~1!"
    SET "substringLength=!%2!"
    SET nextChar=!string:~%substringLength%,1!

    REM IF "!nextChar!"==" " (
        SET substring=!string:~0,%substringLength%!
        ECHO !substring!
        SET /A cutSpaceCount=!substringLength!+1
        SET string=!string:~%cutSpaceCount%!

        ECHO !string!

        ENDLOCAL & SET %1=%string% & SET %3=%substring% & EXIT /B 0
    REM ) ELSE (
    REM     Some other case    
    REM )

EXIT /B 0

当我在 if 语句中注释时,这不起作用:

IF "!nextChar!"==" " (
    SET substring=!string:~0,%substringLength%!
    ECHO !substring!
    SET /A cutSpaceCount=!substringLength!+1
    SET string=!string:~%cutSpaceCount%!

    ECHO !string!

    ENDLOCAL & SET %1=%string% & SET %3=%substring% & EXIT /B 0
) ELSE (
    REM Some other case    
)
  1. 为什么脚本不能使用 if 语句?
  2. 如何解决?

请注意,我的例程还应包含一个 else 语句,我将其删除,因为问题相同。

最佳答案

问题是这一行:

SET string=!string:~%cutSpaceCount%!

当此行放在 IF 命令内时,cutSpaceCount 的值将在 inside 的代码块(括号)内更改IF,因此它必须通过 !cutSpaceCount! 延迟扩展进行扩展,不是通过 %cutSpaceCount% 标准扩张。

您应该使用类似于“双重延迟扩展”的东西,即类似于此构造:

SET string=!string:~!cutSpaceCount!!

当然,这行不通,所以诀窍是使用 for 命令获取 first 延迟扩展的值,然后使用 FOR 参数 完成第二次延迟扩展:

for /F %%c in ("!cutSpaceCount!") do SET "string=!string:~%%c!"

当子例程中的最终值返回给调用程序时,会发生类似的问题。这是最终的工作代码:

@ECHO OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
    SET string=Hello World wasserschutzpolizei
    SET /A substringLength=5
    CALL :get_substring string substringLength substring
    ECHO !string!
    ECHO !substring!
    EXIT /B 0
ENDLOCAL

:get_substring
    SETLOCAL ENABLEDELAYEDEXPANSION

    SET "string=!%~1!"
    SET "substringLength=!%2!"
    SET "nextChar=!string:~%substringLength%,1!"

    IF "!nextChar!"==" " (
        SET "substring=!string:~0,%substringLength%!"
        ECHO !substring!
        SET /A cutSpaceCount=!substringLength!+1

        for /F %%c in ("!cutSpaceCount!") do SET "string=!string:~%%c!"

        ECHO !string!
        for /F "delims=" %%s in ("!string!") do for /F "delims=" %%b in ("!substring!") do (
            ENDLOCAL & SET "%1=%%s" & SET "%3=%%b" & EXIT /B 0
        )

    ) ELSE (
        ECHO Some other case    
    )

PS - 您不需要在 SET/A 命令中扩展变量值。而不是:

SET /A cutSpaceCount=!substringLength!+1

你可以简单地使用:

SET /A cutSpaceCount=substringLength+1

关于batch-file - 批处理 - 延迟扩展不适用于周围的 if 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50574549/

相关文章:

windows - CMD 提示/批处理文件中的更多颜色

windows - 调用 mvn tomcat :run in multiple projects/different directories using a batch file

linux - 根据unix中附加文件的行数将文件附加到多个文件中

linux - 文本文件中的单引号完整路径文件无法执行 for 循环处理 mv : cannot stat . .. 没有这样的文件或目录

java - 如何在不使用 -cp 开关的情况下在 Groovy 中自动加载数据库 jar?

python - 使用 Python 3.5 执行 PowerShell 命令

powershell - 如何在Powershell中输出粗体文本?

string - 批处理 : Returning a value from a SETLOCAL EnableDelayedExpansion

vbscript - 为什么 WScript.StdOut.Write 方法在 VBS 和 JScript 中的行为不同?

java - 如何使用CMD启动停止tomcat服务器?