Powershell форматирует выходные данные типа System.Xml.XmlElement

#xml #powershell

#xml #powershell

Вопрос:

Я пытаюсь создать список имен компьютеров, который затем можно использовать для вызова другой команды 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»

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

Ответ №1:

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

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

имеет этот эквивалент (более мощный способ, используйте .Подключайтесь только тогда, когда вам нужно):

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

или

 $typeInformation = 'Type1'
$arr = ($ConfigFile | Select-Xml "/Servers/$typeInformation/Machine/Name" | % { $_.Node.'#text' }) -join ','
  

Ответ №2:

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

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

Комментарии:

1. Мне нравится это решение. Намного проще, чем присваивать результат переменной и использовать цикл for для извлечения необходимой информации. Спасибо за помощь. Я должен начать использовать этот стиль написания сценариев.

Ответ №3:

Вот ваш код: Вы просто забыли «Machine» в запросе 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
}