来自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
我可能做错了什么!
答案 0 :(得分:2)
PowerShell正常工作,完全按照你的要求去做:
$jobname = @(gwmi -Namespace "root/veeambs" -Class "job" | select typetostring, name | ft -HideTableHeaders | Out-String)
结果是一个包含一个包含整个表的字符串元素的数组。因此你得到了
<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
我相信您将能够使用相同的方法来解决您的问题。