Массив 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

Я уверен, что вы сможете использовать тот же метод для решения вашей проблемы.

Другие вопросы по тегам