考虑以下批处理脚本片段。 。 .
目标是如果定义了
log
(一个日志文件),则将输出写入 2 个文件 - 或仅使用 arg 2
(另一个日志文件)。 我过去曾成功地使用过这种语法(至少 - 根据我的记忆),但由于某种原因,这个连续失败并给出了代码下方发布的错误输出。 我今天错过了什么愚蠢的事情?
@Echo Off
Setlocal EnableDelayedExpansion EnableExtensions
If defined log (
Echo Log is defined.
If not "%~4"=="Yes" (
If "%~nx2"=="%logNam%" (
<nul (set /p "lineout=!WO_Log1!!cr!!lf!")>>%log%
) else (
<nul (set /p "lineout=!WO_Log1!!cr!!lf!")>>%log%
<nul (set /p "lineout=!WO_Arg1!!cr!!lf!")>>"%~2"
)
) else (
>>%log% Echo(!WO_Log1!
>>"%~2" Echo(!WO_Arg1!
)
) else (
Echo Log is NOT defined.
Echo "%~2"
If not "%~4"=="Yes" (
<nul (set /p "lineout=!WO_Log1!!cr!!lf!")>>"%~2"
) else (
2>&1 >>"%~2" Echo(!WO_Log1!
)
)
The syntax of the command is incorrect. C:\Users\foobar> <nul (set /p "lineout=!WO_Log1!!cr!!lf!")>>
我是否弄错了,或者如果 var
log
从未被定义过,那么这条线应该永远不会被评估吗? 我已经确认删除对 %log%
的任何引用可以解决问题,但看起来这不应该成为问题。 。 。 我是否需要先检查逆矩阵,然后将第一个条件改为if NOT defined log
?
漫长的日子会对一个人产生这样的影响。 。 .
我几乎在任何地方都虔诚地使用变量的
DelayedExpansion
版本(保存“但它可能会慢很多”的评论) - 我几乎 never 延迟扩展的一个 var 是 log
var因为我几乎总是将它设置在文件的开头。 。 。 下面的代码工作正常。 。 。将此作为答案发布,但布朗尼积分将授予那些能够提供“为什么”这有效而初始示例无效的人。
如果我不得不冒险猜测,我希望 DelayingExpansion
在
!var!
上使用 %var%
告诉 Command Interpreter
“推迟对该变量的解析,直到它被调用”,而 %var%
隐式地强制解释器尝试将 var 解析为包含的数据(在本例中为nul
),因此失败。 。 .? @Echo Off
Setlocal EnableDelayedExpansion EnableExtensions
If defined log (
Echo Log is defined.
If not "%~4"=="Yes" (
If "%~nx2"=="!logNam!" (
REM The line below switched %log% with !log!
<nul (set /p "lineout=!WO_Log1!!cr!!lf!")>>!log!
) else (
REM The line below switched %log% with !log!
<nul (set /p "lineout=!WO_Log1!!cr!!lf!")>>!log!
<nul (set /p "lineout=!WO_Arg1!!cr!!lf!")>>"%~2"
)
) else (
REM The line below switched %log% with !log!
>>!log! Echo(!WO_Log1!
>>"%~2" Echo(!WO_Arg1!
)
) else (
Echo Log is NOT defined.
Echo "%~2"
If not "%~4"=="Yes" (
<nul (set /p "lineout=!WO_Log1!!cr!!lf!")>>"%~2"
) else (
2>&1 >>"%~2" Echo(!WO_Log1!
)
)