gpt4 book ai didi

windows - 命令的语法不正确。在 endlocal & 设置 [batch]

转载 作者:可可西里 更新时间:2023-11-01 11:28:02 26 4
gpt4 key购买 nike

我有一个通过引用批量返回值的函数。

:errorCheck
setlocal
set "test_command=%~1"
set "err_code=%~2"
FOR /F "delims=" %%a IN ('%test_command% 2^>^&1 1^>NUL') DO (
set err_msg="%%~a"
)
if [%err_msg%] neq [] (
if not x%err_msg:%err_code%=%==x%err_msg% (
set "error=true"
)
)

if [%err_msg%]==[] (
set "error=false"
)
endlocal & set "%3=%error%"
exit /b

函数执行正确,返回值也正确,但在 endlocal & set "%3=%error%"set "%3=%error%" 部分它给我错误:

The syntax of the command is incorrect.

虽然返回值是正确的,但我无法理解为什么会发生这种情况。

最佳答案

问题不在返回值,而在子串操作。不允许使用您的语法。表达式没有像你想的那样求值。变量的开始和结束是

%err_msg:%err_code%=%
^........^ ^.^
var1 var2

要在另一个变量的子字符串操作中使用一个变量,您需要使用延迟扩展。试试看

:errorCheck
setlocal enableextensions disabledelayedexpansion
set "test_command=%~1"
set "err_code=%~2"
set "error=false"
set "err_msg="

FOR /F "delims=" %%a IN ('
%test_command% 2^>^&1 1^>NUL
') DO set "err_msg=%%~a"

if defined err_msg (
setlocal enabledelayedexpansion
if not "!err_msg:%err_code%=!"=="%err_msg%" (
endlocal
set "error=true"
) else ( endlocal )
)

endlocal & set "%3=%error%"
exit /b

现在解析器看到的变量是

!err_msg:%err_code%=!
^........^
^...................^

但由于并非所有字符都允许在 substrig 操作中,根据 err_code 的内容,它也可能会失败。

如果可以的话,您可以将子字符串操作更改为管道命令搜索所需的错误代码

:errorCheck testCommand errorCode returnVariable
setlocal enableextensions disabledelayedexpansion
( %~1 2>&1 1>nul | find "%~2" > nul ) && ( set "error=true" ) || ( set "error=false" )
endlocal & set "%~3=%error%"
exit /b

即:

  • 执行命令 (%~1),与原始代码一样,stdout 重定向到 null,stderr 重定向到 stdout,因此我们读取错误流。
  • 使用find 过滤命令的输出,搜索错误代码。如果找到,find 不会提高错误级别,如果没有找到,则会提高错误级别。
  • 使用条件执行,设置了error 变量。如果前面的命令没有提高错误级别,则执行 && 之后的代码。如果命令提高了错误级别,则执行 || 之后的代码。
  • 环境空间恢复,返回变量赋值

关于windows - 命令的语法不正确。在 endlocal & 设置 [batch],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29619995/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com