我在管道中運行一系列 cmdlet,為每個設定一個 -PipeLineVariable,但由于在管道中使用了更高的 Sort-Object cmdlet,我得到了意想不到的結果。
以示例代碼為例,這只是我完整代碼的一部分。Get-VMhost 正在拉隨機主機,但我的 OCD 想要一個按字母順序排列的串列,并且只想選擇前 2 個。因此,我在 Get-VMhost 之后添加了一個 Sort-Object,但這會在最后破壞管道變數。
get-vmhost -PipelineVariable VMHost | sort Name | select -first 2 | % {write-host $vmhost}
VMHost3
VMHost3
相反,我希望看到
VMHost1
VMHost2
我理解這是某些 cmdlet(例如 Sort-Object)必須聚合所有輸入以進行處理然后中斷流的結果。我有點明白這一點。
不使用...
Select -First 2
...我將得到整個資料集,我可以簡單地排序作為我對所有資料進行排序的最后一步。我也可以在最后添加 select -first 2 。我只是想了解這個問題以及它發生的原因以及是否有預先的行內解決方法。
***編輯...我有我的答案,這只是在排序陳述句中設定管道變數。謝謝@mklement0
uj5u.com熱心網友回復:
您只需將common-PipelineVariable引數 與Sort-Objectcmdlet一起使用,而不是Get-VMHost為了讓管道變數反映已排序的物件序列。
一個簡化的例子:
3, 6, 2, 1 | Sort-Object -PipelineVariable value | Select-Object -First 2 |
ForEach-Object { $value }
輸出:
1
2
uj5u.com熱心網友回復:
您問題中的代碼的行為符合預期/設計(見下文)。
我不確定您想要實作什么,但可能您想要以下內容:
$myVMs = get-vmhost | sort Name | select -first 2
$myVMs | ForEach-Object { write-host $_ }
或者,在單個管道中:
get-vmhost | sort Name | select -first 2 | ForEach-Object { write-host $_ }
參考:about_CommonParameters
PipelineVariable 允許訪問通過使用此引數的命令傳遞到下一個管道段的最新值。管道中的任何命令都可以使用命名的 PipelineVariable 訪問該值。該值在傳遞到下一個管道段時分配給變數。這使得 PipelineVariable 比可能需要在多個位置分配的特定臨時變數更易于使用。
與
$_or不同$PSItem,使用 PipelineVariable 允許任何管道命令訪問由前一個命令以外的命令傳遞(和保存)的管道值。管道命令可以在處理通過管道的下一個專案時訪問最后一個管道值。這允許命令將其輸出反饋給先前的命令(或自身)。
警告
PipelineVariable 的范圍僅限于呼叫它的管道。管道外部使用相同名稱的變數在管道執行之前被洗掉。當管道終止時,PipelineVariable 超出范圍。如果管道中的多個命令指定相同的 PipelineVariable,則只有一個共享變數。該變數將使用指定變數的命令的最新管道輸出進行更新。
一些阻塞命令會在生成任何輸出之前收集所有管道項,例如 Sort-Object 或 Select-Object -Last。在阻塞命令之前的命令中分配的任何 PipelineVariable 在阻塞命令之后的命令中使用時始終包含來自前面命令的最終管道項。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/430556.html
