2017-06-05 59 views
2

下面是一個樣本PowerShell腳本:重定向標準輸入(讀主機)PowerShell腳本

$in = read-host -prompt "input" 
write-host $in 

下面是一個示例「的test.txt」文件:

hello 

我們想傳遞管道從powershell輸入。下面是一些我曾嘗試:

.\test.ps1 < test.txt 
.\test.ps1 < .\test.txt 
.\test.ps1 | test.txt 
.\test.ps1 | .\test.txt 
test.txt | .\test.ps1 
.\test.txt | .\test.ps1 
get-content .\test.txt | .\test.ps1 

即使只是試圖呼應輸入無法正常工作或:

echo hi | \.test.ps1 

上述每個示例不產生錯誤總是提示用戶,而不是接受的管道輸入。

注意:我的PowerShell版本表說4.0.-1-1

感謝

編輯/結果:對於那些尋找解決的辦法,你不能管輸入到PowerShell腳本。你必須更新你的PS文件。請參閱下面的摘錄。

回答

2

問題是您的腳本\.test.ps1不期望值。

試試這個:

param(
    [parameter(ValueFromPipeline)]$string 
) 

# Edit: added if statement 
if($string){ 
    $in = "$string" 
}else{ 
    $in = read-host -prompt "input" 
} 

Write-Host $in 

或者,您可以使用魔術變量$input沒有param部分(我不完全理解這個所以真的不能推薦它):

Write-Host $input 
+0

所以人們必須編輯PS1文件來支持管道輸入。有沒有辦法重定向標準輸入?例如,在C#中,您可以簡單地使用Console.ReadLine(),並且可以通過CMD管道連接到該控制檯。您不會將任何參數傳遞給可執行文件,您將重定向輸入。 – Peanut

+1

@Peanut可能有一種方法來獲得你所追求的,這超出了我的知識範圍。 ['Read-Host'文檔](https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.utility/read-host)指定它不接受來自管道的值。爲了獲得_functionality_,我會使用'if'語句。爲了將輸入重定向到PowerShell,我相信在腳本 – gms0ulman

+0

中除了'Read-Host'外,還需要一些東西,謝謝您研究它。我沒有看到巨大的註釋,指出「您無法將輸入傳遞到此cmdlet」。 – Peanut

1

你不能管輸入到Read-Host,但不應該這樣做。

PowerShell不支持輸入重定向(<)。實際上,這不是(重要的)限制,因爲a < b可以被重寫爲b | a(即,發送輸出b作爲輸入到a)。

如果參數的值丟失並且它被設置爲強制屬性,PowerShell可以提示輸入參數。例如:

function test { 
    param(
    [parameter(Mandatory=$true)] [String] $TheValue 
) 
    "You entered: $TheValue" 
} 

如果不爲$TheValue參數提供輸入,PowerShell的將進行提示。

另外,您可以指定參數接受管道輸入。例如:

function test { 
    param(
    [parameter(ValueFromPipeline=$true)] [String] $TheValue 
) 
    process { 
    foreach ($item in $TheValue) { 
     "Input: $item" 
    } 
    } 
} 

所以,如果你寫

"A","B","C" | test 

功能將輸出如下:

Input: A 
Input: B 
Input: C 

所有這一切都PowerShell的文檔中的拼寫相當簡潔。

+0

感謝您的摘錄。我同意'不需要這樣做',但在某些情況下,我們有一個我們不想更新的PowerShell文件,因爲這會導致QA需要重新驗證它。這就是人生。 – Peanut

+0

'<'在PowerShell中無法用於輸入重定向,因此您沒有真正的選擇。 –

相關問題