簡體   English   中英

如果從命令提示符運行,powershell腳本將在“ if”子句中退出

[英]powershell script exits in “if” clause if run from command prompt

我對兩個看似相同的腳本之間的差異感到驚訝。

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

不知道為什么重定向到輸入無效,但是,如果您僅將腳本指定為powershell的輸入參數,則它似乎可以工作:

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

這必須是一個錯誤。

在使用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反饋網站(connect.microsoft.com)上報告此情況。

編輯:

是的,周傑倫證明了這一點。 根本問題是Powershell不支持'<'運算符。 我整天都在網上搜索一些官方文檔,但沒有找到。 我只是想起我來檢查一些舊筆記,發現在v1中不支持對此內容的引用。 它僅支持“>”。

如果我發現比我的記憶更正式的東西,我會嘗試更新。 將原始文本留作補充。


我不認為公認的答案在這里是正確的。

看看Lee Holmes博客: 鏈接

他是Powershell團隊的一名開發人員,並且撰寫了Powershell Cookbook,只是為了給他的話一點點信任。

我遇到了一些復雜而古老的Bat腳本,這些腳本依賴於一些時髦的奇特二進制重定向,從而遇到了這種問題。 Powershell將運行Bat文件,但在二進制重定向發生的那一刻,它將停止。 使用[Process]:如博客文章中所述,啟動非常有效,並且使我能夠像其他任何行為良好的腳本一樣解析Bat文件的輸出。

在您的情況下,我假定“ diff”是實際的exe而不是函數,並且其輸出二進制文件而不是文本。

附帶一提,我真的不認為需要像您一樣將腳本的輸出重定向到Powershell。 似乎適得其反。 您編寫了一個powershell腳本,不使用專門提供的參數來處理運行的輸入似乎是一種浪費。

我不認為這是一個錯誤。 嘗試在控制台上鍵入每行,您將看到正在發生的事情。 當您鍵入並打開方括號而不將其關閉時,PowerShell將進入多行輸入模式。 要退出此模式,您需要使用右方括號和后面的空白行。 如果在“ C”之前或之后有空白行,則應該可以使用。

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

我無法自己使用此功能,powershell忽略了我發送給它的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM