Powershell数组使用命令异常工作

时间:2018-01-10 09:37:39

标签: arrays powershell veeam

来自Linux,我尝试使用PowerShell脚本自动收集Veeam Backup作业。

我开始看到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

我可能做错了什么!

2 个答案:

答案 0 :(得分: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 }

答案 1 :(得分:0)

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

由于我没有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

我相信您将能够使用相同的方法来解决您的问题。