2017-04-13 4 views
2

オブジェクトに何かを追加する際にループを使用する際に問題があります。スクリプトへのループ

この部分は動作します:

# 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 
を10

これは次を作成します:

VMName,Jobname,Enabled 

VM1 VM2,Job1,True,... 

何を変更する必要がありますか?

答えて

0

内側のループでは、名前をループする代わりにオブジェクトをループしてみます。これらの行の何か:

# 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の応答からほとんどのコードを借りました。

2

あなたが計算プロパティを使用することができます。

$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を返すことを想定しています。

0

私はそうのような仮想マシンをループだろう、と$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でのジョブを使用していないが、これはどのように影響するかが表示されませんループロジック。

0

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回答出力この出力は、

VMName         JobName    Enabled 
------         -------    ------- 
S01         Backup Job Server1  True 
S02         Backup Job Server2  True 
C1 C2 C3 C4 C5 C6     Backup Job Clients  True 
+0

各ジョブの出力を同じオブジェクトに追加しますか? この回答の値を使用して実際に期待される結果は何ですか?私の理解では、この出力に基づいて、 '$ vmnames'内に' C1'から 'C6'が単一項目として格納されています。 – gms0ulman

+0

はい$ jobsのすべての出力を$ vmnamesの各単一項目に追加します。私はVM1がJob1にあり、VM2がJob1にあり、すべてのVMに対して新しい行が作成されていることがわかります。 – Stefan

+0

Hmmm、 '$ vmnames'を配列に明示的にキャストしてみてください: ' [array] $ vmnames =($ job.GetObjectsInJob()).name' – gms0ulman