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