PowerShell - Passage d'arguments développés à l'applet de commande Start-Job
-
21-12-2019 - |
Question
Nous essayons de créer un tableau avec des variables, puis de transmettre ce tableau tel qu'il est développé à un script, qui sera exécuté par Start-Job.Mais en réalité, cela échoue et nous ne parvenons pas à en trouver la raison.Peut-être que quelqu'un peut aider !?
$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"
Cela échoue avec
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
Même si $config.name est défini correctement.
Des idées?
Merci d'avance!
La solution
J'utilise cette méthode pour passer des paramètres nommés:
$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"
Il vous permet d'utiliser le même hachage de paramètres que vous utiliseriez pour écaillir au script si vous l'exécutez localement.
Ce bit de code:
$(&{$args}@arguments)
Embedded dans la chaîne extensible créera le paramètre: Valeur paires pour les arguments:
$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
Autres conseils
Le guillemet simple est le symbole de chaîne littérale, vous définissez l'argument "-Name" sur la chaîne $config.Name
pas Value of $config.Name
.Pour utiliser la valeur, utilisez ce qui suit :
$arguments= @()
$arguments+= ("-Name", $config.Name)
$arguments+= ("-Account", $config.Account)
$arguments+= ("-Location", $config.Location)