Powershell: passage de paramètres à un emploi
J'ai un script qui nécessite un certain nombre de paramètres:
param ([string]$FOO="foo",[string]$CFG='\ps\bcpCopyCfg.ps1', [string]$CFROM="none", `
[string]$CTO="none", [switch]$HELP=$FALSE, [switch]$FULL=$FALSE, [string]$CCOL="none" `
,[string]$CDSQUERY="none", [string]$CMSSRV="none" `
,[string]$CSYBDB="none", [string]$CMSDB="none")
lorsqu'il est appelé à partir de l'invite de commande, par exemple
powershell .\bcpCopy.ps1 -BDEPUIS earn_n_deduct_actg -CTO fin_earn_n_deduct_actg -CCOL f_edeh_doc_id
tout fonctionne bien.
J'ai besoin cependant de lancer plusieurs (dizaines) d'instances du script en parallèle et j'ai écrit un script qui appelle celui de faire le travail comme un travail:
Je prépare un tableau avec les arguments (y compris les mots clés comme "-CFG") anhd passer de début d'emploi:
# Prepare script block to be released
$ARGS=("-CFG ", $CFG, "-CSYBDB ", $SYBDB, "-CMSDB ",$MSDB, "-CFROM ", $SYBTBL, "-CTO ",$MSTBL)
if ($FULL) {
$ARGS = $ARGS + " -FULL"
} else {
$ARGS = $ARGS + " -CCOL $($args[5]) "
}
"Argument array:"
$ARGS
start-job -scriptblock {powershell.exe -file '\ps\bcpCopy.ps1'} -ArgumentList $ARGS
Malheureusement, le script appelé à ne pas recevoir les arguments: l'appelant imprime le tableau et il a l'air bien:
Tableau d'arguments:
-CFG
\ps\bcpCopyCfgOAH.ps1
-CSYBDB
vnimisro
-CMSDB
IMIS_UNOV
-BDEPUIS
earn_n_deduct_ref
-CTO
fin_earn_n_deduct_ref
-PLEIN
mais la sortie de l'appelé scripts dit que le seul paramètre reçu est le fichier de configuration -- tout le reste sont à leurs valeurs par défaut.
PS C:\ps> recevoir-emploi 1391
12/17/2010 10:54:14 lancer le téléchargement de la table, aucun; source db none;
12/17/2010 10:54:14 table Cible est none; cible db est none;
12/17/2010 10:54:14 fichier de Config est \ps\bcpCopyCfg.ps1.
12/17/2010 10:54:14 serveur Cible (MS SQL) est secap900-nouvelle
12/17/2010 10:54:14 Source base de données doit être spécifié. Sortie de...
Pouvez-vous svp m'indiquer ce que je fais mal?
OriginalL'auteur Lubo | 2010-12-17
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr exactement ce que vous essayez de faire, mais ça a l'air mal:
Vous êtes à la création d'un tout nouveau processus powershell inutilement. Essayez plutôt ceci:
Le "@args" syntaxe est appelé "splatting." Cela permettra d'élargir les arguments passés et de s'assurer que chaque élément est traité comme un paramètre. L'esperluette (&) est "l'appel" de l'opérateur.
Merci pour les conseils. Maintenant, les emplois sont libérés et semblent à la pendaison de ne rien faire. Continuer à accrocher même j'ai mis une sortie dans le script juste après il démarre et imprime les arguments. BTW, avec cette manière de commencer les travaux de la tâche mngr montre encore 15 powershell traités-exactement la # j'ai commencé à
et aussi manuellement après l'arrêt de l'emploi, de recevoir des-emploi ne retourne rien
Comme je l'ai dit, le & (call) commence un processus powershell, mais le processus se bloque.
@Args (le splatting)après le nom du script a été cependant une révélation -- résolu mon argument de passage de problème, merci beaucoup. Donc, la "finale"ver qui fonctionne est de start-job -scriptblock {powershell.exe -fichier "c:\ps\bcpCopy.ps1' @args} -ArgumentList $ARGS
OriginalL'auteur x0n
Une autre façon est de mettre le @ devant le tableau. J'ai changé le $ARGS variable $drapeaux de différencier $args dans le scriptblock de $flags.
OriginalL'auteur T.CK