将具有变量存在测试的 Windows Batch Scriptblock 传送到另一个命令 [重复]

Posted

技术标签:

【中文标题】将具有变量存在测试的 Windows Batch Scriptblock 传送到另一个命令 [重复]【英文标题】:Pipe a Windows Batch Scriptblock with existence test of variable to another command [duplicate] 【发布时间】:2021-06-28 05:18:29 【问题描述】:

我正在尝试使以下代码工作,以测试管道变量是否存在,这是对我要执行的实际代码的简化,其中包含脚本块内的其他代码,但这演示了问题:

( if defined some_variable echo ok ) | more
echo was unexpected at this time

它告诉我“此时回声出乎意料”。在“if”语句后引用带括号并不能解决问题,它只是抱怨括号

( if defined some_variable ( echo ok ) ) | more
( was unexpected at this time.

“if”语句的两种变体在不在被管道传输的代码块中时都可以工作。

if defined some_variable echo ok
ok
if defined some_variable ( echo ok )
ok

此外,我可以执行代码块,但输出到一个文件,这可以捕获脚本块的输出,尤其是即使脚本块中有多行代码:

( if ok defined some_variable echo ok ) > some_text_file.txt

这种“if”风格在脚本块到管道结构中起作用:

( if 1==1 echo ok ) | more
ok
( if NOT 1==2 echo ok ) | more
ok

但我不明白为什么使用 'defined' 关键字的存在性测试会完全破坏这个管道结构。

我的最终目标是让以下类型的代码在批处理脚本中工作(它比下面的示例有更多的东西),但问题归结为一开始提到的简化炸弹。以下代码将作为批处理脚本将输出回显到命令提示符和日志文件,但脚本块中的变量检查会破坏它。

( 
  echo some_stuff_like_a_program_header
  
  #test existence of a variable and if not defined earlier in script then echo some stuff
  if NOT defined some_variable then_alert_user_with_error_msg
  
  if some_variable==some_value (do_some_stuff) else (do_other_stuff)
  
) | powershell.exe -command '&  $input | tee-object -file out.log '

【问题讨论】:

【参考方案1】:

这是解析器的一个bug,if语句会被压缩成 if definedsome_variable echo ok。 您会看到definedsome_variable 之间的空格已删除

你可以通过后期变量扩展来解决。

set "myLine=if defined path echo ok"
echo pipe | ( %%myLine%%)

或带有转义空格(来自@enjoying SO:Why does the error message appear when IF comparison is in the piped block command?)

echo pipe | ( if defined ^  path echo ok )

要查看内部发生的情况,您可以试试这个调试结构

@echo off
setlocal
(set \n=^
%=empty=%
)
set "debug=echo ### %%cmdcmdline%% ^) %%\n%%"
echo dummy | (
    %debug%
    if defined some_variable echo ok
)

【讨论】:

以上是关于将具有变量存在测试的 Windows Batch Scriptblock 传送到另一个命令 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Windows Batch 区分大小写的字符串变量

具有可变子字符串长度的 Windows Batch SET?

深度学习之Batch Normalization

在 Windows Batch 中,为啥用括号括起来的 for 循环不会扩展它被告知要回显的变量?

BATCH - 无法从函数的变量中返回正确的值

EPOCH, BATCH, INTERATION