如果已定义的 var 无法防止语法错误将输出发送到未定义的 var

问题描述 投票:0回答:1

考虑以下批处理脚本片段。 。 .

目标是如果定义了

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

if-statement batch-file
1个回答
0
投票

漫长的日子会对一个人产生这样的影响。 。 .

我几乎在任何地方都虔诚地使用变量的

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!
   )
 )

	
© www.soinside.com 2019 - 2024. All rights reserved.