0

我来自 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]
}

输出:

马克住在西雅图
乔希住在波士顿
斯蒂芬住在芝加哥

但是当我修改我的 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]
}

输出是:

             工作1
             工作2
             工作3
             工作4
             工作5
             工作6
             工作7
             工作8
             工作9
             工作10
             工作11
             工作12
             工作13
             工作14
             作业15
             工作16
             工作17
             工作18
             工作19
             工作20

 -->

                   错误的
                    真的
                    真的
                   错误的
                    真的
                    真的
                   错误的
                    真的
                    真的
                    真的
                    真的
                    真的
                    真的
                    真的
                    真的
                    真的
                    真的
                    真的
                    真的
                    真的

代替:

工作 1 --> 假
工作 2 --> 真
Job3 --> 真
Job4 --> 错误
等等

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

PS> gwmi -命名空间“root/veeambs”-类“工作”| 选择 typetostring、name、scheduleenabled

typetostring name scheduleenabled
------------ ---- ----------------
             作业 1 错误
             工作 2 真
             工作 3 真
             Job4 错误
             Job5 真
             Job6 真
             Job7 错误
             Job8 真
             Job9 真
             Job10 真
             Job11 真
             Job12 真
             Job13 真
             Job14 真
             Job15 真
             Job16 真
             Job17 真
             Job18 真
             Job19 真
             Job20 真

我可能做错了什么!

4

2 回答 2

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 }
于 2018-01-10T11:28:42.857 回答
0

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

由于我没有 Veeam,因此我无法真正为您提供直接的工作示例,但是..

IE。

$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

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

于 2018-01-10T10:19:58.500 回答