我对两个看似相同的脚本之间的区别感到惊讶。
first.ps1:
"A"
if ($true) { "B" }
"C"
second.ps1:
"A"
if ($true) { "B"
}
"C"
现在打开一个CMD窗口,然后像这样运行这些脚本:
powershell - < first.ps1 powershell - < second.ps1
首先产生:
A B C
而第二只产生
A
答案 0 :(得分:2)
不确定为什么重定向到输入不起作用,但是如果你只是将脚本指定为powershell的输入参数,它似乎有效:
C:\fa2>powershell.exe C:\fa2\tc.ps1
Comparison starts
There was a difference
Comparison over
答案 1 :(得分:2)
这必须是一个错误。
在cmd.exe情况下的重定向中,如果if和else块分别全部在一行上,则该函数正常且正确地完成:
$candidate = '.\foo.txt'
$current= '.\bar.txt'
"Comparison starts"
if ($(diff $(get-content $current) $(get-content $candidate)).length -gt 0){"There was a difference"}
else {"There was not a difference"}
"Comparison over"
但是如果将任一块拆分为多个行并且采用该分支,则脚本将中止而不发出警告/输出。
答案 2 :(得分:2)
编辑:
是的,杰伊证明了这一点。根本问题是Powershell不支持'&lt;'运营商。我一整天都在寻找网上的官方文件,但还没找到。我刚刚发现我检查了一些旧笔记,我发现v1中没有支持这个引用。它只支持'&gt;'。如果我找到比我的记忆更正式的东西,我会尝试更新。将原始文本留给completnes。
我不认为这里接受的答案是真实的。
看看Lee Holmes的博客:link
他是Powershell团队的开发者之一,并撰写了Powershell Cookbook,只是为了让他的话更加可信。
我遇到了一些复杂而古老的Bat脚本,这些脚本依赖于一些时髦的花哨二进制重定向。 Powershell会运行Bat文件,但是在二进制重定向发生的时候它会停止。使用[Process]:按照博客文章中的描述开始工作非常好,并允许我解析Bat文件的输出,就像任何其他表现良好的脚本一样。
在你的情况下,我假设“diff”是一个独立的exe而不是一个函数,它的输出二进制而不是文本。
在旁注中,我真的不认为需要像往常一样将脚本的输出重定向到Powershell。似乎有点适得其反。你写了一个powershell脚本,似乎浪费不使用专门提供的参数来处理运行输入。
答案 3 :(得分:0)
我不认为这是一个错误。尝试在控制台上键入每一行,您将看到发生了什么。当您键入并打开括号并且不关闭它时,PowerShell将进入多行输入模式。要退出此模式,您需要一个右括号和一个空白行。如果在“C”之前或之后有一个空行,它应该可以工作。
当然,也许这是一个错误,只是与多行输入具有相同的效果。 :)
我无法让自己工作,powershell无视我发送的内容。