2009-02-04 75 views
0

我對兩個看似相同的腳本之間的區別感到驚訝。如果從命令提示符運行,powershell腳本在「if」子句中退出

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

當然你可以簡化代碼,不需要磁盤上的特定文件? – 2009-02-05 17:56:31

+0

你運行什麼樣的命令提示符? – 2009-02-05 17:57:32

回答

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)報告這一點。

+0

我沒有可用的連接。我直接通過電子郵件發送了一個PowerShell的人,他說他不認爲PowerShell支持這種輸入重定向。 – 2009-02-05 22:59:21

2

不知道爲什麼重定向到輸入不起作用,但如果你只是指定腳本作爲輸入參數的powershell,似乎工作:

C:\fa2>powershell.exe C:\fa2\tc.ps1 
Comparison starts 
There was a difference 
Comparison over 
2

編輯:

是的,傑伊證明了它。根本問題是Powershell不支持'<'運營商。我一直在網上搜索一些官方文檔,但一直沒有找到它。我剛剛發現我檢查一些舊筆記,並且我發現在v1中沒有支持這個參考。它只支持'>'。

我會嘗試更新,如果我找到比我的記憶更官方的東西。僅爲completnes留下原始文本。


我不認爲在這裏接受的答案是肯定的。

看看李福爾摩斯博客:link

他是在PowerShell團隊的開發者之一,並寫了PowerShell的食譜,只給一點點印證了他的話。

我遇到了一些複雜和古老的蝙蝠腳本依賴於一些時髦的花式二進制重定向這種問題。 Powershell將運行Bat文件,但在二進制重定向發生的地方,它會停止。使用[Process]:按照博客文章中的描述啓動,效果非常好,並允許我解析Bat文件的輸出,就像引導其他任何腳本的腳本一樣。

在你的情況,我假設「差異」是一個真正的EXE,而不是一個函數,它的輸出二進制文件,而不是文本。

在附註上,我真的沒有看到需要像腳步一樣將腳本的輸出重定向到Powershell。似乎會起反作用。你寫了一個powershell腳本,看起來像是一個浪費,不要使用專門提供的參數來處理運行輸入。

0

我不認爲這是一個錯誤。嘗試在控制檯上輸入每一行,你會看到發生了什麼。當您鍵入並打開括號並且不關閉它時,PowerShell進入多行輸入模式。要退出此模式,您需要一個右括號和一個空行。如果你在「C」之前或之後有空行,它應該可以工作。

當然,也許這是一個錯誤,只是具有與多行輸入相同的效果。 :)

我無法得到這個工作我自己,PowerShell忽略了我發送到它。

相關問題