/ / Appelez le script PowerShell à partir d'un fichier de traitement par lots avec tous les paramètres - windows, powershell, fichier de traitement par lots

Appel du script PowerShell à partir d'un fichier de traitement par lots avec tous les paramètres - windows, PowerShell, fichier de traitement par lots

Cette question et ce billet de blog adresse comment passer des paramètres particuliers dans un script PowerShell à partir d'un fichier de commandes.

Comment peut-on transmettre tous les paramètres dans le script PowerShell? Fondamentalement, je souhaite séparer tous les paramètres afin que le fichier de commandes transmette tous les arguments de manière transparente.

modifier pour plus de contexte:

J'utilise actuellement une ligne comme celle-ci:

PowerShell.exe -Command "& "%~dpn0.ps1" "%1" "%2""

Cela fonctionne, mais crée une redondance entre lefichiers tels que, si je mets à jour le script PowerShell pour prendre des arguments différents, je dois également mettre à jour le script batch. Ce qui serait bien si je pouvais faire quelque chose comme:

PowerShell.exe -Command "& "%~dpn0.ps1" "%*""

Réponses:

6 pour la réponse № 1

Essayez ce qui suit:

powershell -File "%~dpn0.ps1" %*
  • Dans des fichiers batch, %* représente tous les arguments passés.[1]

  • -File est le paramètre à utiliser pour invoquer des scripts via la CLI de PowerShell.

  • Tous les arguments restants sont ensuite passés comme comme si (tandis que -Command les soumettrait à un autre cycle d'interprétation par PowerShell[2] ).

[1] Notez que pour cmd.exe (fichiers de commandes) pour reconnaître un argument avec un espace incorporé comme un argument unique, vous devez le placer entre "...".
Par exemple, si vous voulez passer des arguments a et b c fichier batch file.cmd, vous devez l'appeler comme
file a "b c".
Passer intégré " les instances, les échapper; par exemple., ""b c"" fait voir PowerShell "b c", y compris les guillemets doubles.
Si vous respectez ces règles, %* - sans citer - passe correctement le tableau d'arguments.
Faire ne pas utilisation "%*" - cela ne fonctionnera pas comme prévu.

[2] En effet, -Command fait que tous les arguments suivants soient réunis par un seul espace, et chaîne résultante est ensuite interprété en tant que commande PowerShell - c’est-à-dire, après que les arguments ont été analysés par les règles de cmd.exe (fichiers batch), ils sont soumis à un autre ronde d'analyse, par PowerShell.
Malheureusement, PowerShell a toujours fonctionné de la sorte, mais le comportement est obscur et risque de semer encore plus de confusion dans le monde Unix, maintenant que PowerShell est devenu multi-plateforme - voir ce numéro de GitHub.