Запуск команды на Azure vm через powershell - PullRequest
1 голос
/ 31 марта 2020

Я пытаюсь вызвать сценарий powershell с помощью другого сценария powershell, и я вижу выходные данные на консоли, но при извлечении в csv значения имеют значение null, а также как можно распечатать отдельное значение, например StandardName (для выходного файла проверки ссылок) et c.

$report =$null
$report= @()
$vms = get-azvm  #vmname detail 
foreach( $vm in $vms){
$data =get-azvm -ResourceGroupName $vm.resourcegroupname -Name $vm.name -Status
if ( ($data.OsName -contains "Windows Server 2016 Datacenter") -and ($data.Statuses.DisplayStatus -contains "VM running") )
{
    Write-Host server name is : $data.Name
    $invoke = Invoke-AzVMRunCommand -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name -CommandId RunPowerShellScript -ScriptPath ./timezone.ps1 
    $output=$invoke.Value[0,1]
    $output
    $report_temp = new-object psobject 
    $report_temp | Add-Member -MemberType NoteProperty -Name "VM Name" -Value $data.Name
    $report_temp | Add-Member -MemberType NoteProperty -Name "Detail" -Value $output.Message
    #assiging value to variable which we had created eariler 
    #$report += $report_temp
  }
}
$report |export-csv "c:\date.csv"

Ниже приведены выходные данные для сценария:

Code          : ComponentStatus/StdOut/succeeded
Level         : Info
DisplayStatus : Provisioning succeeded
Message       : Id                         : UTC
                DisplayName                : (UTC) Coordinated Universal Time
                StandardName               : Coordinated Universal Time
                DaylightName               : Coordinated Universal Time
                BaseUtcOffset              : 00:00:00
                SupportsDaylightSavingTime : False
                DisplayHint : DateTime
                Date        : 3/31/2020 12:00:00 AM
                Day         : 31
                DayOfWeek   : Tuesday
                DayOfYear   : 91
                Hour        : 13
                Kind        : Local
                Millisecond : 841
                Minute      : 55
                Month       : 3
                Second      : 11
                Ticks       : 637212597118417503
                TimeOfDay   : 13:55:11.8417503
                Year        : 2020
                DateTime    : Tuesday, March 31, 2020 1:55:11 PM `

1 Ответ

0 голосов
/ 01 апреля 2020

, но при извлечении в csv значения равны нулю

В этой строке кода $report_temp | Add-Member -MemberType NoteProperty -Name "Detail" -Value $output.Message вы должны использовать $output.Message[0] вместо $output.Message (потому что тип $output.Message это массив, вам нужно использовать индекс для извлечения значения, иначе он не будет добавлять детали к отчету.)

как я могу напечатать отдельное значение, например, StandardName

вам лучше преобразовать вывод в json, а затем преобразовать его в пользовательский объект PSCustomObject. И вы можете использовать свойства (например, StandardName) объекта.

Вот завершенный код:

$report =$null
$report= @()
$vms = get-azvm   #vmname detail 
foreach( $vm in $vms){
$data =get-azvm -ResourceGroupName $vm.resourcegroupname -Name $vm.name -Status
if ( ($data.OsName -contains "Windows Server 2016 Datacenter") -and ($data.Statuses.DisplayStatus -contains "VM running") )
{
    Write-Host server name is : $data.Name
    $invoke = Invoke-AzVMRunCommand -ResourceGroupName $vm.ResourceGroupName -VMName $vm.Name -CommandId RunPowerShellScript -ScriptPath ./timezone.ps1
    $output=$invoke.Value[0,1]
    $output
    $report_temp = new-object psobject 
    $report_temp | Add-Member -MemberType NoteProperty -Name "VM Name" -Value $data.Name
    $report_temp | Add-Member -MemberType NoteProperty -Name "Detail" -Value $output.Message[0]

    #here convert the $output to json
    $temp =$output.message[0]
    $temp = $temp | ConvertTo-Json
    $temp = $temp.Replace("\n\n","\n").replace("\n\n","\n").replace("\n",";") 
    $temp = $temp.Remove($temp.LastIndexOf(";"),1) 
    $temp = $temp -replace '\s',''
    $temp = $temp -replace '\"',''
    $items = [ordered]@{}
    $temp.Split(";") | ForEach-Object {
        $key, $value = $_.Split(":")
        $items[$key] = $value
        }

    $t2 = $items | ConvertTo-Json

    #here convert the json to custom PSCustomObject object
    $b1 = $t2 | ConvertFrom-Json

    #here, add the StandardName to the report
    $report_temp | Add-Member -MemberType NoteProperty -Name "StandardName" -Value $b1.StandardName

    #assiging value to variable which we had created eariler 
    $report += $report_temp
  }
}
$report |export-csv "c:\date.csv"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...