2010-11-26 30 views
2

Je rencontre des problèmes lors de l'exécution de PowerShell avec un script qui doit utiliser un nombre variable de paramètres.Comment passer un paramètre de chaîne à Powershell pour ConvertFrom-StringData à partir de la ligne de commande?

Le fichier de script ressemble à ceci:

param([string]$paramString) 

$params = ConvertFrom-StringData $paramString 
$params 

Exécution du script directement powershell donne le résultat attendu:

[PS] C:\some\path>.\test.ps1 "a=foo `n b=bar `n c=moo" 

Name       Value 
----       ----- 
c        moo 
a        foo 
b        bar 

Appel powershell de la ligne de commande avec le même script et paramètres montre cette :

C:\some\path>powershell -nologo -file ./test.ps1 "a=foo `n b=bar `n c=moo" 

Name       Value 
----       ----- 
a        foo `n b=bar `n c=moo 

Il semble que la chaîne transmise est dans un certain format, la fonction ConvertFrom-StringData ne peut plus l'analyser.

Répondre

2

L'approche avec -File est problématique car le paramètre n'est pas évalué par cmd (il est dans PowerShell) et les équivalents de nouvelles lignes ne sont pas étendus, ils sont passés littéralement.

Le problème peut être résolu si nous laissons encore PowerShell de le faire à l'aide -Command à la place:

powershell -nologo -command "./test.ps1 ""a=foo `n b=bar `n c=moo""" 

Il est laid: nous devons doubler tous les " intérieure dans la commande. Mais ça fonctionne. (La commande peut être définie par plusieurs paramètres, je préfère simplement utiliser un seul paramètre: cela me semble plus simple).

+2

Merci Roman, qui a travaillé. Juste un addendum pour autre chose: j'avais un second paramètre pour le script qui contenait une chaîne qui devrait être utilisée littéralement. L'utilisation de "" param1 "" "" a = foo 'n b = bar' n c = moo "" a entraîné la concaténation des deux chaînes. J'ai dû utiliser 'param1' "" a = foo 'n b = bar' n c = moo "" pour que ça fonctionne comme prévu. –

+2

Oui ... L'appel de scripts PowerShell avec des paramètres complexes de cmd est douloureux. S'il est connu au moment de la conception qu'un script est pour les appels de cmd, alors son interface d'entrée doit être conçue aussi simple que possible. Considérez également ce conseil, car l'approche avec '-Command' ne couvre pas tous les cas d'utilisation de l'approche' -File'. –

0

Utilisez guillemet simple pour passer des paramètres à Powershell avec le script comme ceci:

C:\some\path>powershell .\test.ps1 'a=foo' 'b=bar' 'c=moo'