Comment passer des arguments de ligne de commande à un PowerShell ps1 fichier
Pendant des années, j'ai utilisé le cmd/DOS/Windows
shell et passé arguments de ligne de commande pour les fichiers de commandes. Par exemple, j'ai un fichier, zuzu.bat
et pour cela, j'ai accès %1
, %2
, etc. Maintenant, je veux faire la même chose quand je l'appelle un PowerShell
script when I am in a Cmd.exe shell
. J'ai un script, xuxu.ps1
(et j'ai ajouté PS1 à mon PATHEXT variable et associés fichiers PS1 avec PowerShell). Mais peu importe ce que je fais, il me semble impossible d'obtenir quelque chose de la $args
variable. Il a toujours une longueur de 0.
Si je suis dans un PowerShell
shell, au lieu de cmd.exe
, il fonctionne (bien sûr). Mais je ne suis pas encore assez à l'aise pour vivre dans l'environnement PowerShell à temps plein. Je ne veux pas de type powershell.exe -command xuxu.ps1 p1 p2 p3 p4
. J'ai envie de taper xuxu p1 p2 p3 p4
.
Est-ce possible, et si oui, comment?
L'exemple je ne peut pas se rendre au travail est trivial, foo.ps1:
Write-Host "Num Args:" $args.Length;
foreach ($arg in $args) {
Write-Host "Arg: $arg";
}
Les résultats sont toujours comme ça:
C:\temp> foo
Num Args: 0
C:\temp> foo a b c d
Num Args: 0
c:\temp>
Vous devez vous connecter pour publier un commentaire.
Cet article aide. En particulier, cette section:
c'est à dire
moyens d'exécuter le fichier myfile.ps1 et arg1 arg2 & arg3 sont les paramètres pour le script PowerShell.
xuxu p1 p2 p3 p4
").OK, alors d'abord c'est la rupture d'une de base de la fonction de sécurité en PowerShell. Avec cette compréhension, voici comment vous pouvez le faire:
Vous pouvez mettre un
-NoProfile
argument là aussi en fonction de ce que votre profil n'.Après creuser par le biais de la PowerShell de la documentation, j'ai découvert quelques informations utiles sur cette question. Vous ne pouvez pas utiliser la
$args
si vous avez utilisé leparam(...)
au début de votre fichier; au lieu de cela, vous aurez besoin d'utiliser$PSBoundParameters
. J'ai copier/coller votre code dans un script PowerShell, et il a travaillé comme vous pouvez vous attendre dans PowerShell version 2 (je ne suis pas sûr de la version que vous étiez lorsque vous avez rencontré ce problème).Si vous utilisez
$PSBoundParameters
(et cela ne fonctionne que si vous utilisezparam(...)
au début de votre script), alors il n'est pas un tableau, c'est une table de hachage, de sorte que vous aurez besoin de faire référence à l'aide de la paire clé /valeur.Et lorsqu'il est appelé avec...
Le résultat est...
Vous pouvez déclarer vos paramètres dans le fichier, comme param:
Puis d'appeler la PowerShell de fichier comme
.\temp.ps1 para1 para2....para10
, etc.Peut-être que vous pouvez envelopper le PowerShell invocation dans un
.bat
fichier comme ceci:Si vous ensuite mis ce fichier dans un dossier de votre
PATH
, on pourrait appeler des scripts PowerShell comme ceci:Citant pouvez obtenir un peu désordonné, mais:
Vous ne pouvez pas obtenir "xuxu p1 p2 p3 p4" comme il semble. Mais quand vous êtes dans PowerShell et vous définissez
Vous pouvez exécuter ces scripts comme ceci:
ou
ou
J'espère que le fait de vous un peu plus à l'aise avec PowerShell.
si vous voulez vous prévaloir ps1 scripts à partir de cmd et de passer des arguments sans invoquer le script comme
vous pouvez effectuer les opérations suivantes
C'est en supposant que powershell.exe est dans votre chemin
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/ftype