2017-01-17 17 views
0

我將XmlElement傳遞給一個函數,該函數又將XmlElement傳遞到遠程執行的腳本塊中。發生的是隻有一些元素通過foreach循環讀取。這似乎是無論如果我通過與$using的XML或傳遞它作爲ArrayList的XML。在遠程腳本塊中使用Xml.XmlElement時的foreach循環

XML部分:

<task> 
    <apps> 
     <app name="Sample"> 
      <db name="Basic"/> 
      <db name="Interntl"/> 
      <db name="Xchgrate"/> 
     </app> 
     <app name="Vision"> 
      <db name="Plan1"/> 
     </app> 
    </apps> 
</task> 

PowerShell代碼:

foreach ($App in $using:task.apps.app) { 
    $AppName = $App.name 
    foreach ($Db in $App.db) { 
    $DbName = $Db.name 
    $AppFolder = "$DestinationFolder\$AppName\$DbName" 
    $AppFolder 
    } 
} 

得到的輸出是這個如果$DestinationFolder被設定爲C:\分段:

C:\Staging\Objects\Applications\Sample\Basic 
C:\Staging\Objects\Applications\Sample\Interntl 
C:\Staging\Objects\Applications\Sample\Xchgrate

我混淆爲什麼我沒有看到視覺應用程序和數據庫條目?這就像它只是跳過它?更奇怪的是,如果我註釋掉

<db name="Plan1"/> 

輸出中有Vision應用程序。

C:\Staging\Objects\Applications\Sample\Basic 
C:\Staging\Objects\Applications\Sample\Interntl 
C:\Staging\Objects\Applications\Sample\Xchgrate 
C:\Staging\Objects\Applications\Vision\

回答

0

的腳本塊內的對象成爲Deserialized.System.Xml.XmlElement對象,這顯然的行爲從常規System.Xml.XmlElement對象略有不同。您可以通過運行像這樣的腳本塊裏面看到的對象類型:

$using:task | Get-Member 

爲了避免這個問題,創建您的文件夾列表中的腳本塊以外,並在遠程主機上調用腳本塊時,字符串數組作爲參數傳遞:

$AppFolders = foreach ($App in $task.apps.app) { 
    foreach ($Db in $App.db) { 
    '{0}\{1}\{2}' -f $DestinationFolder, $App.name, $Db.name 
    } 
} 

Invoke-Command -Computer 'remotehost' -ScriptBlock { 
    Param($folders) 
    ... 
} -ArgumentList (,$AppFolders) 

表達式,$AppFolders是避免展開數組所必需的。沒有它,只有列表的第一個元素將被傳遞給$folders

0

因此,根據此answer,您需要將節點包裝到新的XML文檔對象中並將其傳遞到腳本塊中。所以乾脆什麼工作對我來說是這樣做

$wrapper = New-Object System.Xml.XmlDocument 
$wrapper.AppendChild($wrapper.ImportNode($task, $true)) | Out-Null 

通過-ArgumentList(,$包裝)

$sb = { 
param([object]$wrapper) 
foreach ($App in $wrapper.task.apps.app) { 
    $AppName = $App.name 
    foreach ($Db in $App.db) { 
    $DbName = $Db.name 
    $AppFolder = "$DestinationFolder\$AppName\$DbName" 
    $AppFolder 
    } 
} 
} 

工作就像一個魅力然後通過$包裝!感謝所有的幫助。