2013-02-20 13 views
5

Sto scrivendo script PowerShell generico per eseguire distribuzioni su macchine remote. Ho colpito un problema che non posso invaso, e questo problema è con parametri con le doppie virgolette in scriptblock passavano ArgumentListI parametri con virgolette non vengono passati correttamente a Scriptblock da ArgumentList

ho qualcosa di simile a questo:

$remoteAddress = "some-pc" 
$deploymentCommand = "D:\some path\Command.exe" 
$deploymentPackages = @(`"“package - one - external"`", `"“package - two - external"`", `"“package - three - internal"`") 

foreach ($deploymentPackage in $deploymentPackages) 
{ 
invoke-command -ComputerName $remoteAddress -ScriptBlock { param ($deployCmd, $deployPackage) & $deployCmd -package:$deployPackage -action:doit } -ArgumentList $deploymentCommand,$deploymentPackage 
} 

ho aggiunto le virgolette doppie in $ deploymentPackages. E ancora mi sto mio comando eseguito remotly come questo (che ovviamente non):

D:\some path\Command.exe -package:package - one - external -action:doit 
D:\some path\Command.exe -package:package - two - external -action:doit 
D:\some path\Command.exe -package:package - three - external -action:doit 

mentre corretto percorso di esecuzione dovrebbe essere:

D:\some path\Command.exe -package:"package - three - external" -action:doit 

senza virgolette intorno pacchetto - uno - esterno che pasticcio up everystig

Come superare questo problema, perché ho testato il numero di soluzioni e non di esse ha funzionato.

Grazie per l'aiuto in anticipo!

risposta

5

Si potrebbe fare qualcosa di simile

$remoteAddress = "some-pc" 
$deploymentCommand = "D:\some path\Command.exe" 
$deploymentPackages = @('package - one - external', 'package - two - external', 'package - three - internal') 
$remoteScript = { 
    param($deployCmd, $deployPackage) 
    & $deployCmd "-package:$deployPackage" -action:doit 
} 

foreach ($deploymentPackage in $deploymentPackages) 
{ 
    invoke-command -ComputerName $remoteAddress -ScriptBlock $remoteScript -ArgumentList $deploymentCommand,$deploymentPackage 
} 

Questo bundle -package:<some string here> in un singolo argomento quando viene passato al vostro eseguibile, che è lo stesso di fare qualcosa di simile a -package:"aaa bbb ccc" in cmd.exe.

Suppongo che tu non vuoi citazioni letterali passati al exe, solo per -package:<some string here> per essere un unico argomento a prescindere di spazi in <some string here>

Se si desidera citazioni letterali da passare al exe, utilizzare quanto sopra codice con

& $deployCmd "-package:`"$deployPackage`"" -action:doit 
+0

Questa soluzione ha funzionato perfettamente. Grazie! – Midi

1

Provare a utilizzare le virgolette singole attorno alla stringa con le virgolette doppie. Ho semplificato lo script un po 'per scrivere semplicemente la stringa invece di eseguirla.

$remoteAddress = "some-pc"; 
$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"'); 

foreach ($deploymentPackage in $deploymentPackages) 
{ 
    invoke-command -ComputerName $remoteAddress -ScriptBlock { 
     param ($deploymentPackage) write-host ("-package:{0} -action:doit" -f $deploymentPackage); 
    } -ArgumentList $deploymentPackage; 
} 
8

È possibile risolvere questo problema utilizzando le virgolette singole per avvolgere le stringhe. Con le virgolette singole, il contenuto tra virgolette non verrà modificato (le variabili non si espanderanno e i segni come le virgolette saranno mantenuti). Per esempio.

PS > '"this is a test"' 
"this is a test" 

Quindi, per fissare lo script, provare a sostituire l'array deploymentpackages con questo:

$deploymentPackages = @('"package - one - external"', '"package - two - external"', '"package - three - internal"') 
1

Usa """. Ad esempio,

$Var = "One" 

$Var visualizzerà One.

Mentre """$Var""" visualizzerà One

Problemi correlati