在下面的脚本中,我调用了一个带有字符串的子例程,该字符串的子字符串的最大长度和第三个不存在的变量来取回子字符串。
脚本应该检查具有最大子字符串长度的字符串之后的下一个字符是否是空格,如果是,则按该空格剪切字符串(删除空格)并返回子字符串并通过剪切更改传递的字符串子串部分。示例:
字符串:"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
)
- 为什么脚本不能使用 if 语句?
- 如何解决?
请注意,我的例程还应包含一个 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/