循环到脚本
问题描述:
我有一个问题,使用循环向对象中添加东西。循环到脚本
这部分工作:
# Get Backup Jobs
$jobs = Get-VBRJob | ?{$_.JobType -eq "Backup"}
foreach ($job in $jobs) {
$jobOptions = New-Object PSObject
$jobOptions | Add-Member -MemberType NoteProperty -Name "JobName" -value $job.name
$jobOptions | Add-Member -MemberType NoteProperty -Name "Enabled" -value $job.isscheduleenabled
输出:
Jobname,Enabled,...
Job1,True,...
我要的是:
VMName,Jobname,Enabled
VM1,Job1,True,...
VM2,Job1,True,...
VM3,Job2,True,...
我想:
# Get Backup Jobs
$jobs = Get-VBRJob | ?{$_.JobType -eq "Backup"}
foreach ($job in $jobs) {
$vmnames = ($job.GetObjectsInJob()).name
$jobOptions = New-Object PSObject
$jobOptions | Add-Member -MemberType NoteProperty -Name "VMName" -value
$vmnames
$jobOptions | Add-Member -MemberType NoteProperty -Name "JobName" -value
$job.name
$jobOptions | Add-Member -MemberType NoteProperty -Name "Enabled" -value
$job.isscheduleenabled
This创建:
VMName,Jobname,Enabled
VM1 VM2,Job1,True,...
我必须改变什么?
答
在内部循环中,我会尝试循环遍历对象而不是遍历名称。沿着这些方向的东西:
# Get Backup Jobs
$jobs = Get-VBRJob | ?{$_.JobType -eq "Backup"}
foreach ($job in $jobs) {
# change starts here; additional loop over VMs
foreach ($vm in $job.GetObjectsInJob()){
[array]$jobOptions += New-Object PSObject -Property @{
"VMName" = $vm.name
"JobName" = $job.name
"Enabled" = $job.isscheduleenabled
}
}
}
我借用了gms0ulman的回应中的大部分代码。
答
你可以使用计算性能:
$jobs = Get-VBRJob |
Where-Object JobType -eq "Backup" |
Select-Object @{l="VMName"; e={($_.GetObjectsInJob()).name}},
@{l="JobName"; e={$_.name}},
@{l="Enabled"; e={$_.isscheduleenabled}}
注:我认为$job.GetObjectsInJob().name
返回VMNAME。
答
我会遍历所有的虚拟机像这样,用+=
添加到$jobOptions
:
# Get Backup Jobs
$jobs = Get-VBRJob | ?{$_.JobType -eq "Backup"}
foreach ($job in $jobs) {
$vmnames = ($job.GetObjectsInJob()).name
# change starts here; additional loop over VMs
foreach ($vm in $vmnames){
[array]$jobOptions += New-Object PSObject -Property @{
"VMName" = $vm
"JobName" = $job.name
"Enabled" = $job.isscheduleenabled
}
}
}
免责声明:我没有使用PowerShell中的工作,但不认为这会如何影响循环逻辑。
答
Martins答案产生这个输出。
VMName JobName Enabled
------ ------- -------
S01 Backup Job Server1 True
S02 Backup Job Server2 True
{C1, C2, C3, C4, C5, C6} Backup Job Clients True
gms0ulman answer产生这个输出。
VMName JobName Enabled
------ ------- -------
S01 Backup Job Server1 True
S02 Backup Job Server2 True
C1 C2 C3 C4 C5 C6 Backup Job Clients True
是否要将每个作业的输出添加到相同的对象? 使用此答案中的值是什么实际的预期结果?我的理解是,'C1'到'C6'作为单个项目存储在'$ vmnames'内,基于这个输出。 – gms0ulman
是的,我想将$ jobs的所有输出添加到$ vmnames中的每个项目。所以我有列表,我可以看到VM1在Job1中,VM2在Job1中,并且为每个VM创建一个新行。 – Stefan
嗯,试着明确地将'$ vmnames'转换为数组: '[array] $ vmnames =($ job.GetObjectsInJob())。name' – gms0ulman