2017-06-16 68 views
-1

我正在寫一個PowerShell腳本,它可以帶2個參數 - 計算機名或序列號 - 並輸出一些關於相應計算機的信息。但是,當我從管道傳入一個值時,它總是進入錯誤的參數。PowerShell管道輸入錯誤參數

這裏是我的代碼:

Param 
(
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$True)] 
    [String]$ComputerName, 
    [Parameter(ValueFromPipeline=$true,ValueFromPipelineByPropertyName=$True)] 
    [String]$SerialNumber 
) 

然後使用這些值從SCCM中提取信息。

不過,如果我使用下面的行調用腳本:

"<ComputerName>" | .\Get-SerialNumber.ps1 -ComputerName $_ 

計算機名被投入的serialNumber參數,而不是計算機名稱參數。

如果我把在

"<SerialNumber>" | .\Get-SerialNumber.ps1 -SerialNumber $_ 

值被傳遞到ComputerName參數。這裏發生了什麼?他們爲什麼被反向傳遞?

如果我在

.\Get-SerialNumber.ps1 -SerialNumber "<SerialNumber>" 

.\Get-SerialNumber.ps1 -ComptuerName "<ComputerName>" 

鍵入它工作正常。只有當值通過管道傳遞時,它纔會出現問題。

爲了記錄,我試着重新啓動我的PowerShell會話,以確保在會話中不會發生奇怪的事情,甚至完全在另一臺計算機上嘗試。它仍然以同樣的方式發生。

+0

@briantist這不是重複鏈接的問題。我只是看着那個問題/答案,我的問題沒有作爲答案的一部分回答。這個問題在非常基本的層面上顯示了管道的功能,這是管道使用的更高級別。 – Randy

+0

我不同意;你的問題顯示了對基本管線使用的誤解,這是鏈接副本提供的。你試圖做一些無效的事情,而不是一種先進的用法。 – briantist

+0

@ briantist是的,這是一個誤解,這是這個網站的很大一部分。但是,我的誤解絕不是在提供的鏈接中描述的。在閱讀完這個問題及其答案後,我不會再理解我想要做什麼。另一方面,關於DID下面答案的評論有助於我理解這個特定的概念,併爲我的問題提供了一個實際的答案。 – Randy

回答

1

你打電話的方式沒有意義。如果您通過管道傳遞ComputerName,然後還指定-ComputerName作爲命名參數,當然它會將管道綁定到接受管道輸入的唯一其他參數。您是如何期望接受同一個參數的兩個不同值?你會如何使用它?

+0

不應該'$ _'表示正在通過管道傳遞的值? 不會'-ComputerName $ _'是否意味着將管道中的值分配給ComputerName參數? – Randy

+0

@Randy不,完全沒有。你必須在你的函數中使用一個'Process {}'塊,然後在那個進程塊中,'$ ComputerName'指向當前的管道對象。對於流水線中的每個項目,「進程」塊將被調用一次。 – briantist

+2

*不應該'$ _'代表正在通過管道傳遞的值嗎?*是代表來自* outer * pipeline的值:''外部管道「| %{「」| 。\ Get-SerialNumber.ps1 -ComputerName $ _}'。你雖然可以這樣寫:'「」| 。\ Get-SerialNumber.ps1 -ComputerName {$ _}',但它不會阻止將管道值綁定到其他'ValueFromPipeline'參數。 – PetSerAl