Powershell阵列与命令异常工作

Powershell array working abnormally with commands

来自 Linux,我正在尝试使用 PowerShell 脚本自动收集 Veeam 备份作业。

我开始了解 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]
}

输出:

mark live in seattle
josh live in boston
stephen live in chicago

但是当我修改我的 2 个数组时添加命令而不是字符串:

$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

 -->

                   False
                    True
                    True
                   False
                    True
                    True
                   False
                    True
                    True
                    True
                    True
                    True
                    True
                    True
                    True
                    True
                    True
                    True
                    True
                    True

而不是:

Job1 --> False
Job2 --> True
Job3 --> True
Job4 --> False
etc.

运行 手动我得到的整个命令:

PS> gwmi -Namespace "root/veeambs" -Class "job" | select typetostring, name, scheduleenabled

typetostring name                            scheduleenabled
------------ ----                            ---------------
             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

我可能做错了什么!

您不需要两次获取信息并合并它。如果你得到了对象,你需要的信息就会在那里。您还需要对对象的属性进行交互,而不是对对象本身进行交互,即使您指定变量是一个数组,它也将是该数组中的单个对象,因此数组中的第一个条目是完整的对象.

因为我没有 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

我相信你一定能用同样的方法解决你的问题。

PowerShell 工作正常,完全按照您的指示进行:

$jobname = @(gwmi -Namespace "root/veeambs" -Class "job" | select typetostring, name | ft -HideTableHeaders | Out-String)
  • 通过 WMI 列出作业。
  • Select两个属性。
  • 将所选属性格式化为 table。
  • 将整个 table 变成一个字符串。
  • 将该字符串放入一个数组中。

结果是一个数组,其中一个字符串元素包含整个 table。因此你得到

<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 }