Передача массива в хэш-таблицу параметров Invoke-AzureRmVMRunCommand не работает - PullRequest
0 голосов
/ 23 сентября 2019

Я пытаюсь выполнить модуль Runbook PowerShell для учетной записи Azure Automation, который должен выполнить сценарий PowerShell на виртуальной машине Azure Win, используя следующую инструкцию:

Invoke-AzureRmVMRunCommand -ResourceGroupName $sdvobjVM1.ResourceGroupName -Name $sdvstrNameVM1 -CommandId 'RunPowerShellScript' -ScriptPath $sdvstrScriptFileNameTmp -Parameter $sdvhshParamsFolderCopy

Параметр инструкции выглядит следующим образом:

$sdvhshParamsFolderCopy = @{Para1='String1'; Para2='String2'; Para3='String3'; Para4='String4'; Para5='String5'; Para6=@('Application', 'Data', 'Execution')}

Вопрос: Возможно ли это с помощью встроенного массива ("Para6") в хеш-таблице?И если да, то как?

Я пробовал это в течение некоторого времени безуспешно, так как не могу получить доступ к значениям массива в удаленном скрипте;см. ниже для деталей и фактических примеров кода.Пожалуйста, помогите кому-нибудь !!!

Сведения о проблеме:

В модуле запуска Azure Automation у меня есть:

...

[string] $sdvstrFileShare = "$sdvstrNameSA1.file.core.windows.net\$sdvstrFileShareName"
[array] $sdvastrCopyFolders = @('Application', 'Data', 'Execution')

...

$sdvhshParamsFolderCopy = @{sdvstrNameSA1 = $sdvstrNameSA1;
                            sdvstrSA1AccessKey = $sdvstrSA1AccessKey;
                            sdvstrFileShare = $sdvstrFileShare;
                            sdvstrSrcDriveLetter = $sdvstrSrcDriveLetter;
                            sdvstrDstDriveLetter = $sdvstrDstDriveLetter;
                            sdvastrCopyFolders = $sdvastrCopyFolders
    }

(здесь убраны могильные акценты с разрывной линией)

В вызываемом скрипте у меня есть:

# Parameters
Param (
    [string] $sdvstrNameSA1,
    [string] $sdvstrSA1AccessKey,
    [string] $sdvstrFileShare,      
    [string] $sdvstrSrcDriveLetter,
    [string] $sdvstrDstDriveLetter,     
    [array] $sdvastrCopyFolders
)

Оба [массив] $ sdvastrCopyFolders и [массив[]] $ sdvastrCopyFolders не будет работать.

Симптом состоит в том, что я получаю в вызываемом скрипте:

$sdvastrCopyFolders | ForEach{$_} | Out-File  -FilePath 'D:\sdvastrCopyFoldersForEach.txt'
System.Object[]

$sdvastrCopyFolders.Item(0) | Out-File  -FilePath 'D:\sdvastrCopyFoldersItem0.txt'
System.Object[]

$sdvastrCopyFolders.GetValue(0) | Out-File  -FilePath 'D:\sdvastrCopyFoldersGetValue.txt'
System.Object[]

, но не ожидаемые члены массива:

Application
Data
Execution

Если я тестирую передачу / извлечение параметров HT / Array между двумя сценариями в простом PowerShell, все работает как положено:

PS Z:\> $sdvastrCopyFolders.Length
3

PS Z:\> (,$sdvastrCopyFolders).GetValue(0)
Application
Data
Execution

PS Z:\> (,$sdvastrCopyFolders).GetValue(0).Item(2)
Execution

1 Ответ

0 голосов
/ 26 сентября 2019

Согласно моему тесту, когда мы запускаем команду Invoke-AzureRmVMRunCommand, серверная часть выполняет некоторые действия для обработки значения параметра, тип которого является массивом.Тогда мы не можем получить значение в скрипте.Но внутренний конец не будет обрабатывать параметр типа строки.Поэтому я предлагаю вам использовать строковый параметр в скрипте.Если одному параметру нужны некоторые значения, вы можете разделить их специальными символами, такими как ,.Например:

Мой runbook автоматизации:

$connectionName = "AzureRunAsConnection"
try
{
    # Get the connection "AzureRunAsConnection "
    $servicePrincipalConnection=Get-AutomationConnection -Name $connectionName         

    "Logging in to Azure..."
    Add-AzureRmAccount `
        -ServicePrincipal `
        -TenantId $servicePrincipalConnection.TenantId `
        -ApplicationId $servicePrincipalConnection.ApplicationId `
        -CertificateThumbprint $servicePrincipalConnection.CertificateThumbprint 
}
catch {
    if (!$servicePrincipalConnection)
    {
        $ErrorMessage = "Connection $connectionName not found."
        throw $ErrorMessage
    } else{
        Write-Error -Message $_.Exception
        throw $_.Exception
    }
}
Add-AzureRmAccount -Credential $mycreds -Tenant e4c9ab4e-bd27-40d5-8459-230ba2a757fb -ServicePrincipal 
}
catch {
    if (!$servicePrincipalConnection)
    {
        $ErrorMessage = "Connection $connectionName not found."
        throw $ErrorMessage
    } else{
        Write-Error -Message $_.Exception
        throw $_.Exception
    }
}
[string] $Filesharename = "test"
[string] $Folders ="test,test1"
$Params = @{Filesharename = $Filesharename;

                            Folders = $Folders;
    }


$groupName=' '
$vmName =' '
$path=' '

Invoke-AzureRmVMRunCommand -ResourceGroupName $groupName -Name $vmName -CommandId'RunPowerShellScript' -ScriptPath $path -Parameter $Params


Сценарий:

  Param (
        [string] $Filesharename, 
        [string] $Folders 
        )


      $Folders | Out-File -FilePath 'C:\test.txt' -Append
      $test =  $Folders -split ','

      $test.GetType() | Out-File -FilePath 'C:\test.txt' -Append

      $test.Length | Out-File -FilePath 'C:\test.txt' -Append

      "-----------------------" | Out-File -FilePath 'C:\test.txt' -Append
      $test | foreach{$_} |  Out-File -FilePath 'C:\test.txt' -Append

      "-----------------------" | Out-File -FilePath 'C:\test.txt' -Append

      $test[0] | Out-File -FilePath 'C:\test.txt' -Append


Результат: enter image description here

...