PowerShell Passagem expandida argumentos para o cmdlet Start-Job
-
21-12-2019 - |
Pergunta
Estamos tentando criar uma matriz com as variáveis e, em seguida, passar a matriz ampliada de um script, que deve ser executado por Iniciar o Trabalho.Mas, na verdade, ele falha e somos incapazes de encontrar a razão.Talvez alguém possa ajudar!?
$arguments= @()
$arguments+= ("-Name", '$config.Name')
$arguments+= ("-Account", '$config.Account')
$arguments+= ("-Location", '$config.Location')
#do some nasty things with $config
Start-Job -ScriptBlock ([scriptblock]::create("& .'$ScriptPath' [string]$arguments")) -Name "Test"
Ele falha com
Cannot validate argument on parameter 'Name'. The argument is null or empty. Provide an argument that is not null or empty, and then try the command again.
+ CategoryInfo : InvalidData: (:) [Select-AzureSubscription], ParameterBindingValidationException
+ FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.WindowsAzure.Commands.Profile.SelectAzureSubscriptionCommand
+ PSComputerName : localhost
Apesar $config.o nome é definido corretamente.
Qualquer idéias?
Obrigado antecipadamente!
Solução
Eu uso esse método para a passagem de parâmetros nomeados:
$arguments =
@{
Name = $config.Name
Account = $config.Account
Location = $config.Location
}
#do some nasty things with $config
Start-Job -ScriptBlock ([scriptblock]::create("&'$ScriptPath' $(&{$args}@arguments)")) -Name "Test"
Ele permite que você use o mesmo parâmetro de hash que você usaria para splat para o script se você estivesse executando localmente.
Essa parte do código:
$(&{$args}@arguments)
incorporado na cadeia de caracteres expansível vai criar o Parâmetro:Os pares de valores para os argumentos:
$config = @{Name='configName';Account='confgAccount';Location='configLocation'}
$arguments =
@{
Name = $config.Name
Account = $config.Account
Location = $config.Location
}
"$(&{$args}@arguments)"
-Account: confgAccount -Name: configName -Location: configLocation
Outras dicas
A única citação literal de seqüência de caracteres de símbolo, você está definindo o "Nome" argumento para a cadeia $config.Name
não Value of $config.Name
.Para usar o valor, use a seguinte:
$arguments= @()
$arguments+= ("-Name", $config.Name)
$arguments+= ("-Account", $config.Account)
$arguments+= ("-Location", $config.Location)