Массив Powershell работает ненормально с командами
Исходя из Linux, я пытаюсь автоматизировать сбор заданий Veeam Backup с помощью скрипта PowerShell.
Я начал понимать, как работают массивы PowerShell, а затем попробовал провести небольшой тест:
$users = 'mark','josh','stephen'
$city = 'seattle','boston','chicago'
for ($i = 0; $i -lt $users.Count; $i++) {
Write-Host $users[$i] 'live in' $city[$i]
}
Выход:
Марк жить в Сиэтле Джош живет в Бостоне Стивен живет в Чикаго
Но когда я изменяю команду добавления двух массивов вместо строк:
$jobname = @(gwmi -Namespace "root/veeambs" -Class "job" | select typetostring, name | ft -HideTableHeaders | Out-String)
$isenabled = @(gwmi -Namespace "root/veeambs" -Class "job" | select typetostring, scheduleenabled | ft -HideTableHeaders | Out-String)
for ($i = 0; $i -lt $jobname.Count; $i++) {
echo $jobname[$i] ' --> ' $isenabled[$i]
}
Выход:
Job1 Job2 Job3 Job4 Job5 Job6 Job7 Job8 Job9 Job10 Job11 JOB12 Job13 Job14 JOb15 Job16 Job17 Job18 Job19 Job20 -> Ложь Правда Правда Ложь Правда Правда Ложь Правда Правда Правда Правда Правда Правда Правда Правда Правда Правда Правда Правда Правда
вместо:
Job1 -> False Job2 -> True Job3 -> True Job4 -> False и т.п.
Запустив всю команду вручную, я получаю:
PS> gwmi -Namespace "root / veeambs" -Класс "job" | выберите строку типа, имя, расписание имя типа строки ------------ ---- --------------- Job1 False Job2 True Job3 True Job4 False Job5 True Job6 True Job7 False Job8 True Job9 True Job10 True Job11 True Job12 True Job13 True Job14 True Job15 True Job16 True Job17 True Job18 True Job19 True Job20 True
Я, наверное, что-то не так делаю!
2 ответа
PowerShell работает совершенно нормально и делает именно то, что вы сказали:
$jobname = @(gwmi -Namespace "root/veeambs" -Class "job" | select typetostring, name | ft -HideTableHeaders | Out-String)
- Список рабочих мест через WMI.
- Выберите два свойства.
- Отформатируйте выбранные свойства в виде таблицы.
- Превратите всю таблицу в одну строку.
- Поместите эту строку в массив.
В результате получается массив с одним строковым элементом, содержащий всю таблицу. Следовательно, вы получаете
<table1> --> <table2>
скорее, чем
<table1_item1> --> <table2_item1>
<table1_item2> --> <table2_item2>
...
На самом деле вы хотите что-то вроде этого:
Get-WmiObject -Namespace "root/veeambs" -Class "job" |
Select-Object name, scheduleenabled |
ForEach-Object { '{0} --> {1}' -f $_.name, $_.scheduleenabled }
Вам не нужно извлекать информацию дважды и объединять ее. Если вы получите объект, необходимая информация будет там. Вам также нужно будет взаимодействовать со свойствами вашего объекта, а не с самим объектом, даже если вы укажете, что переменная является массивом, она будет единственным объектом в этом массиве, следовательно, первая запись в массиве является полным объектом,
Поскольку у меня нет Veeam, я не могу предоставить вам прямой пример этого, но..
То есть.
$Computer = @(Get-WmiObject -Class Win32_ComputerSystem)
$Computer.PSObject.Properties | Where-Object {$_.Name -like "Is*"} | ForEach-Object {
Write-Host $_.Name "-->" $_.Value
}
Будет выводить...
IsReadOnly --> False
IsFixedSize --> True
IsSynchronized --> False
Я уверен, что вы сможете использовать тот же метод для решения вашей проблемы.