2010-11-26 2 views
2

Ich habe Probleme beim Ausführen von Powershell mit einem Skript, das eine variable Anzahl von Parametern verwenden sollte.Wie übermittele ich einen String-Parameter für Powershell für ConvertFrom-StringData von der Befehlszeile?

Die Skriptdatei sieht wie folgt aus:

param([string]$paramString) 

$params = ConvertFrom-StringData $paramString 
$params 

Ausführen des Skript direkt in Powershell ergibt das erwartete Ergebnis:

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

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

Aufruf Powershell von der Kommandozeile mit dem gleichen Skript und Parameter zeigt diese :

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 

Es scheint wie der übergebene String ist in einem Format, so dass die ConvertFrom-StringData Funktion es nicht mehr parsen kann.

Antwort

2

Ansatz mit -File ist problematisch, weil der Parameter nicht von cmd ausgewertet wird (bei PowerShell ist) und neue Zeilen Äquivalente sind nicht erweitert, sie werden buchstäblich übergeben.

Das Problem kann gelöst werden, wenn wir Powershell noch lassen, statt durch die Verwendung -Command zu tun:

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

Es ist hässlich: wir haben all inneren " in dem Befehl zu verdoppeln. Aber es funktioniert. (Der Befehl kann durch mehrere Parameter definiert werden; ich bevorzuge nur einen einzigen Parameter: dieser Weg sieht für mich einfacher aus).

+2

Dank Roman, die funktionierte. Nur ein Addendum für eine andere Sache: Ich hatte einen zweiten Parameter für das Skript, das eine Zeichenfolge enthielt, die wörtlich verwendet werden sollte. Die Verwendung von "param1" "" a = foo 'nb = bar' nc = moo "" führte dazu, dass beide Strings verkettet wurden. Ich musste 'param1' "a = foo' n b = bar 'n c = moo" "verwenden, um es wie vorgesehen zum Laufen zu bringen. –

+2

Yeah ... Das Aufrufen von PowerShell-Skripts mit komplexen Parametern von cmd ist schmerzhaft. Wenn zur Entwurfszeit bekannt ist, dass ein Skript für Aufrufe von cmd vorgesehen ist, sollte seine Eingabeschnittstelle so einfach wie möglich gestaltet sein. Berücksichtigen Sie auch diesen Rat, da der Ansatz mit "-Command" nicht alle Anwendungsfälle des 'Files'-Ansatzes abdeckt. –

0

Verwenden Apostroph Parameter zu übergeben mit Skript wie folgt zu Powershell:

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