将具有变量存在测试的 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
。
您会看到defined
和some_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 SET?