Pendant des années, j'ai utilisé le cmd/DOS/Windows
shell et transmis des arguments de ligne de commande aux fichiers batch. Par exemple, j'ai un fichier, zuzu.bat
et ce, accès I %1
, %2
etc. Maintenant, je veux faire la même chose quand j'appelle un PowerShell
scénario when I am in a Cmd.exe shell
. J'ai un script xuxu.ps1
(et j'ai ajouté PS1 à ma variable PATHEXT et aux fichiers PS1 associés avec PowerShell). Mais quoi que je fasse, il me semble incapable d'obtenir quoi que ce soit de la $args
variable. Il a toujours la longueur 0.
Si je suis dans un PowerShell
shell, au lieu de cmd.exe
ça, ça marche (bien sûr). Mais je ne suis pas encore assez à l'aise pour vivre dans l'environnement PowerShell à plein temps. Je ne veux pas taper powershell.exe -command xuxu.ps1 p1 p2 p3 p4
. Je veux taper xuxu p1 p2 p3 p4
.
Est-ce possible, et si oui comment?
L'exemple que je ne peux pas obtenir 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 ceci:
C:\temp> foo
Num Args: 0
C:\temp> foo a b c d
Num Args: 0
c:\temp>
la source
xuxu p1 p2 p3 p4
").Après avoir fouillé dans la documentation PowerShell, j'ai découvert des informations utiles sur ce problème. Vous ne pouvez pas utiliser le
$args
si vous avez utilisé leparam(...)
au début de votre fichier; à la place, vous devrez utiliser$PSBoundParameters
. J'ai copié / collé votre code dans un script PowerShell, et cela a fonctionné comme prévu dans PowerShell version 2 (je ne sais pas quelle version vous étiez lorsque vous avez rencontré ce problème).Si vous utilisez
$PSBoundParameters
(et cela fonctionne UNIQUEMENT si vous utilisezparam(...)
au début de votre script), ce n'est pas un tableau, c'est une table de hachage, vous devrez donc le référencer à l'aide de la paire clé / valeur.param($p1, $p2, $p3, $p4) $Script:args="" write-host "Num Args: " $PSBoundParameters.Keys.Count foreach ($key in $PSBoundParameters.keys) { $Script:args+= "`$$key=" + $PSBoundParameters["$key"] + " " } write-host $Script:args
Et lorsqu'il est appelé avec ...
Le résultat est...
Num Args: 4 $p1=a $p2=b $p3=c $p4=d
la source
pwsh .\ParamTest.ps1 -arg1 val1 -listOfArgs val2 val3 val4
ça, ça n'aime vraiment pas ça. D'un autre côté, si je suis dans PowerShell et.\ParamTest.ps1 -arg1 val1 -listOfArgs val2 val3 val4
que je le fais , cela fonctionne comme je m'y attendais. J'ai entendu dire que c'est ainsi qu'il est censé fonctionner pour des «raisons de sécurité».Powershell>pwsh .\ParamTest.ps1 val1 val2 val3 val4
donne:Num Args: 4 $p1=val1 $p2=val2 $p3=val3 $p4=val4
param
c'est une construction de langage, cependant cela doit être la première chose dans le fichier. Avez-vous déclaré une variable ou autre chose avant? Plus d'informations ici: docs.microsoft.com/en-us/powershell/module/…OK, donc d'abord, cela brise une fonctionnalité de sécurité de base dans PowerShell. Avec cette compréhension, voici comment vous pouvez le faire:
Vous voudrez peut-être y ajouter un
-NoProfile
argument en fonction de ce que fait votre profil.la source
Vous pouvez déclarer vos paramètres dans le fichier, comme param:
[string]$para1 [string]$param2
Et puis appelez le fichier PowerShell comme ça
.\temp.ps1 para1 para2....para10
, etc.la source
Vous pouvez peut-être encapsuler l'invocation PowerShell dans un
.bat
fichier comme ceci:rem ps.bat @echo off powershell.exe -command "%*"
Si vous avez ensuite placé ce fichier dans un dossier de votre
PATH
, vous pouvez appeler des scripts PowerShell comme celui-ci:Les citations peuvent cependant être un peu compliquées:
ps write-host """hello from cmd!""" -foregroundcolor green
la source
Vous ne pouvez pas obtenir "xuxu p1 p2 p3 p4" comme il semble. Mais lorsque vous êtes dans PowerShell et que vous définissez
Vous pouvez exécuter ces scripts comme ceci:
ou
ou
J'espère que cela vous rend un peu plus à l'aise avec PowerShell.
la source
si vous souhaitez appeler des scripts ps1 à partir de cmd et passer des arguments sans appeler le script comme
powershell.exe script.ps1 -c test script -c test ( wont work )
vous pouvez faire ce qui suit
setx PATHEXT "%PATHEXT%;.PS1;" /m assoc .ps1=Microsoft.PowerShellScript.1 ftype Microsoft.PowerShellScript.1=powershell.exe "%1" %*
Cela suppose que powershell.exe est sur votre chemin
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/ftype
la source