Формат вывода Powershell типа System.Xml.XmlElement - PullRequest
3 голосов
/ 15 апреля 2011

Я пытаюсь создать список компьютерных имен, которые затем можно использовать для вызова другой команды powershell.

Ручной процесс:

$Type1Machines="Machine1","Machine2","Machine3","Machine4"
Invoke-command {Powershell.exe C:\myscript.ps1 Type1} -computername $Type1Machines

У меня уже есть информация об имени машин "Type1" в файле XML (MachineInfo.xml)

<Servers>
<Type1>
<Machine><Name>Machine1</Name> <MachineOS>WinXP</MachineOS></Machine>
<Machine><Name>Machine2</Name> <MachineOS>WinServer2003</MachineOS></Machine>
<Machine><Name>Machine3</Name> <MachineOS>WinServer2003</MachineOS></Machine>
<Machine><Name>Machine4</Name><MachineOS>WinServer2003</MachineOS></Machine>
</Type1>
</Servers>

Я пытаюсь написать скрипт, который может вывести список с именем машины типа «Type1» и создать следующий URL.

$ Type1Machines = "Machine1", "machine2", "Machine3", "Machine4"

Пока что я дошел до того, что могу получить список имен компьютеров из xml

    #TypeInformation will be pass as an argument to the final script
    $typeinformation = 'Type1' 
$global:ConfigFileLocation ="C:\machineinfo.xml"
$global:ConfigFile= [xml](get-content $ConfigFileLocation)

$MachineNames = $ConfigFile.SelectNodes("Servers/$typeinformation")
$MachineNames

Выход:

Machine
-------
{Machine1, Machine2, Machine3, Machine4}

Теперь, как мне использовать вышеприведенный вывод и построить нижеприведенный URL?

$ Type1Machines = "Machine1", "machine2", "Machine3", "Machine4"

Любая помощь приветствуется. Спасибо за ваше время!

Ответы [ 3 ]

3 голосов
/ 16 апреля 2011

Принятое решение (скопировано):

[string[]]$arr = @() # declare empty array of strings
$ConfigFile.SelectNodes("/Servers/$typeInformation/Machine") | % {$arr += $_.name}

имеет такой эквивалент (более PowerShellish, используйте .NET только тогда, когда вам нужно):

$typeInformation = 'Type1'
$arr = ($ConfigFile.Servers."$typeInformation".Machine | % { $_.Name }) -join ','

или

$typeInformation = 'Type1'
$arr = ($ConfigFile | Select-Xml "/Servers/$typeInformation/Machine/Name" | % { $_.Node.'#text' }) -join ','
2 голосов
/ 16 апреля 2011

Вот ваш код: Вы только что забыли " Машина " в запросе Xpath

#TypeInformation will be pass as an argument to the final script
$typeinformation = 'Type1' 
$global:ConfigFileLocation ="C:\machineinfo.xml"
$global:ConfigFile= [xml](get-content $ConfigFileLocation)

$Machines = $ConfigFile.SelectNodes("Servers/$typeinformation/Machine")

foreach($Machine in $Machines)
{
  Write-Host $Machine.name
}
2 голосов
/ 16 апреля 2011

Полагаю, вы хотите, чтобы каждое значение имени машины было помещено в массив (для использования с invoke-commmand):

[string[]]$arr = @() # declare empty array of strings
$ConfigFile.SelectNodes("/Servers/$typeInformation/Machine") | % {$arr += $_.name}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...