PowerShell - Pasando argumentos ampliados al cmdlet de puesta en marcha
-
21-12-2019 - |
Pregunta
Estamos tratando de crear una matriz con variables y luego pasar esta matriz tan expandida a un script, que se ejecutará por trabajo de inicio.Pero en realidad falla y no podemos encontrar la razón.Tal vez alguien pueda ayudar!?
$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"
no falla con
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
Aunque $ CONFIG.NAME está configurado correctamente.
¿Alguna idea?
¡Gracias de antemano!
Solución
Utilizo este método para pasar los parámetros con nombre:
$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"
Le permite usar el mismo parámetro HASH que usaría para splat en el script si lo estaba ejecutando localmente.
este bit de código:
$(&{$args}@arguments)
incrustado en la cadena expandible creará el parámetro: pares de valor para los 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
Otros consejos
La única cotización es el símbolo de la cadena literal, está configurando el argumento "-Name" al código de cadena $config.Name
, no Value of $config.Name
.Para usar el valor, use lo siguiente:
$arguments= @()
$arguments+= ("-Name", $config.Name)
$arguments+= ("-Account", $config.Account)
$arguments+= ("-Location", $config.Location)