循环到脚本

问题描述:

我有一个问题,使用循环向对象中添加东西。循环到脚本

这部分工作:

# 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 
+0

是否要将每个作业的输出添加到相同的对象? 使用此答案中的值是什么实际的预期结果?我的理解是,'C1'到'C6'作为单个项目存储在'$ vmnames'内,基于这个输出。 – gms0ulman

+0

是的,我想将$ jobs的所有输出添加到$ vmnames中的每个项目。所以我有列表,我可以看到VM1在Job1中,VM2在Job1中,并且为每个VM创建一个新行。 – Stefan

+0

嗯,试着明确地将'$ vmnames'转换为数组: '[array] $ vmnames =($ job.GetObjectsInJob())。name' – gms0ulman