Comment puis-je transmettre des arguments par lots avec des points dans un script PowerShell?

J’ai un script batch qui sera exécuté par un processus externe qui n’est pas sous mon contrôle. Le processus externe peut fournir une quantité variable d’arguments au script de traitement par lots. Je veux ensuite transmettre ces variables à un script powershell. Le problème est que certaines de ces variables ressemblent à:

-Dfoo.bar = baz

Powershell le décompose en deux arguments. Sur la ligne de commande, je peux simplement append des guillemets autour de l’argument et l’appeler un jour. Mais comment pourrais-je obtenir un lot pour le passer de cette façon? Voici mon script:

@echo off SET CMD=C:\Scripts\foo.ps1 PowerShell.Exe -Command "%CMD%" %* 

J’ai remarqué que cette question est très similaire à celle-ci . Ici, il échappe au caractère $. J’ai essayé de faire quelque chose de similaire pour le point et / ou le tiret, mais je n’ai pas de chance. Quelqu’un a des idées?

Quelque chose comme ça pourrait fonctionner:

 @echo off set "CMD=C:\Scripts\foo.ps1" set "ARGS=%*" set "ARGS=%ARGS: =' '%" PowerShell.Exe -Command "%CMD%" '%ARGS%' 

Manifestation:

 C:\> type test.cmd @echo off set "CMD=C:\test.ps1" set "args=%*" set "args=%args: =' '%" powershell -Command "%CMD%" '%args%' C:\> type test.ps1 $args | % { $_ } C:\> test.cmd -Dfoo.bar=baz -something -Dfoo.bar=baz -something 

Les guillemets simples autour d’un argument empêchent PowerShell de faire des choses géniales avec cet argument. En remplaçant les espaces dans la liste des arguments par ' ' vous mettez des guillemets simples après un argument et avant le suivant. Les guillemets simples “externes” autour de la variable ajoutent les guillemets manquants avant le premier et après le dernier argument.

 C:\> type test2.cmd @echo off set "args=%*" echo %args% set "args=%args: =' '%" echo %args% echo '%args%' C:\> test2.cmd -Dfoo.bar=baz -something -Dfoo.bar=baz -something -Dfoo.bar=baz' '-something '-Dfoo.bar=baz' '-something' 

Si vous appelez votre script depuis CMD, cela fonctionne très bien tel quel:

 C:\>.\foo.bat -Dfoo.bar=baz args are -Dfoo.bar=baz 

Pour résoudre le problème lorsque vous exécutez le script de traitement par lot à partir de PowerShell, utilisez l’ stop parsing operator --% par exemple:

 C:\ PS> .\foo.bat --% -Dfoo.bar=baz args are -Dfoo.bar=baz 

Pour transmettre les choses comme des littéraux, vous pouvez les inclure entre guillemets simples. Ma suggestion serait de le faire pour vos arguments, puis de les séparer une fois dans PowerShell, et de les répartir dans votre commande.

 @echo off SET CMD=C:\Scripts\foo.ps1 PowerShell.Exe -Command "%CMD%" '%*' 

Puis à Powershell:

 Param($PassedArgs) $SplitArgs = $PassedArgs.sortingm("'").split(" ") SomeCommand @SplitArgs