我在 Invoke-Command 中運行一個腳本。我的本地會話中有一個全域變數,它有很多配置。我將此物件傳遞給 Invoke-Command。如何在遠程會話中設定該物件內的屬性?
uj5u.com熱心網友回復:
您嘗試做的事情從根本上是行不通的:
遠程運行的腳本塊必須在不同的行程中(在不同的機器上)運行。[1]
您只能將本地物件的副本傳遞給遠程執行的腳本塊- 通過
Invoke-Command的-ArgumentList引數或通過腳本塊內的$using:參考,但呼叫者看不到您對該副本所做的任何修改。
解決方案是從遠程執行的腳本塊中輸出(回傳)感興趣的資料,然后您可以(重新)將其分配給呼叫方的區域變數。
- 注意:由于 PowerShell 跨行程/計算機邊界使用的基于 XML 的序列化的限制,傳遞和/或回傳的只是原始物件的(無方法)模擬;也就是說,無法保證型別保真度 - 有關背景資訊,請參閱此答案。
例如:
# Define a local object.
$localObject = [pscustomobject] @{ Prop = 42 }
# Pass a *copy* of that object to a remotely executing script block,
# modify it there, then *output* the *modified copy* and
# assign it back to the local variable.
$localObject =
Invoke-Command -ComputerName someServer {
$objectCopy = $using:localObject
# Modify the copy.
$objectCopy.Prop
# Now *output* the modified copy.
$objectCopy
}
請注意,雖然在這個簡單的示例中保持了型別保真度,但回傳的物件使用與遠程處理相關的屬性進行裝飾,例如.PSComputerName- 請參閱此答案
[1] 將物件按原樣傳遞到不同的運行空間,以便呼叫者也可以看到對其的更新,僅當另一個運行空間是同一行程中的執行緒時才有效,例如當您使用and時,即使這樣也只有如果物件是.NET 參考型別的實體。此外,如果多個運行空間有可能嘗試并行更新給定物件,則需要顯式管理并發性以避免執行緒安全問題。Start-ThreadJobForEach-Object -Parallel
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/527284.html
標籤:电源外壳
