如果从命令提示符运行,powershell脚本将在“if”子句中退出

时间:2009-02-04 01:43:53

标签: windows command-line powershell

我对两个看似相同的脚本之间的区别感到惊讶。

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

4 个答案:

答案 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"

但是如果将任一块拆分为多个行并且采用该分支,则脚本将中止而不发出警告/输出。

我会在PowerShell feedback site (connect.microsoft.com)上报告此内容。

答案 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无视我发送的内容。