Quando PowerShell vede un comando che inizia con una stringa, valuta solo la stringa, ovvero, in genere viene ripetuta sullo schermo, ad esempio:
PS> "Hello World"
Hello World
Se si desidera che PowerShell interpreti la stringa come un nome di comando, utilizzare l'operatore di chiamata (&) in questo modo:
PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'
Dopodiché probabilmente dovrai solo citare le coppie parametro / argomento che contengono spazi e / o caratteri di quotazione. Quando si richiama un file EXE come questo con argomenti della riga di comando complessi, è di solito molto utile disporre di uno strumento che mostrerà come PowerShell invia gli argomenti al file EXE. Le estensioni della community di PowerShell dispongono di tale strumento. Si chiama echoargs. Sostituisci semplicemente il file EXE con echoargs - lasciando tutti gli argomenti in atto e ti mostrerà come il file EXE riceverà gli argomenti, ad esempio:
PS> echoargs -verb:sync -source:dbfullsql="Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;" -dest:dbfullsql="Data Source=.\mydestsource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data>
Arg 2 is <Source=mysource;Integrated>
Arg 3 is <Security=false;User>
Arg 4 is <ID=sa;Pwd=sapass!;Database=mydb;>
Arg 5 is <-dest:dbfullsql=Data>
Arg 6 is <Source=.\mydestsource;Integrated>
Arg 7 is <Security=false;User>
Arg 8 is <ID=sa;Pwd=sapass!;Database=mydb; computername=10.10.10.10 username=administrator password=adminpass>
Utilizzando echoargs puoi sperimentare fino a quando non lo ottieni nel modo giusto, ad esempio:
PS> echoargs -verb:sync "-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;"
Arg 0 is <-verb:sync>
Arg 1 is <-source:dbfullsql=Data Source=mysource;Integrated Security=false;User ID=sa;Pwd=sapass!;Database=mydb;>
Risulta che stavo provando troppo prima di mantenere le doppie virgolette attorno alla stringa di connessione. Apparentemente non è necessario perché anche cmd.exe li eliminerà.
A proposito, cappello al team di PowerShell. Sono stati molto utili nel mostrarmi l'incantesimo specifico delle virgolette singole e doppie per ottenere il risultato desiderato, se fosse necessario mantenere le doppie virgolette interne in atto. :-) Si rendono anche conto che questa è un'area di dolore, ma sono guidati dal numero di persone che sono colpite da un problema particolare. Se questa è un'area di dolore per te, allora vota questa presentazione di bug di PowerShell .
Per ulteriori informazioni sull'analisi di PowerShell, consultare la mia serie di blog efficaci su PowerShell , in particolare l' elemento 10 - "Informazioni sulle modalità di analisi di PowerShell"
AGGIORNAMENTO DEL 04/04/2012: questa situazione diventa molto più semplice da gestire in PowerShell V3. Vedi questo post del blog per i dettagli .