Ketika PowerShell melihat perintah yang dimulai dengan string, ia hanya mengevaluasi string, yaitu, biasanya menggemakannya ke layar, misalnya:
PS> "Hello World"
Hello World
Jika Anda ingin PowerShell mengartikan string sebagai nama perintah, gunakan operator panggilan (&) seperti:
PS> & 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe'
Setelah itu Anda mungkin hanya perlu mengutip pasangan parameter / argumen yang berisi spasi dan / atau karakter kutipan. Ketika Anda memohon file EXE seperti ini dengan argumen baris perintah yang kompleks, biasanya sangat membantu untuk memiliki alat yang akan menunjukkan kepada Anda bagaimana PowerShell mengirim argumen ke file EXE. The PowerShell Komunitas Extensions memiliki alat tersebut. Ini disebut echoargs. Anda cukup mengganti file EXE dengan echoargs - meninggalkan semua argumen di tempatnya, dan itu akan menunjukkan kepada Anda bagaimana file EXE akan menerima argumen, misalnya:
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>
Dengan menggunakan echoarg, Anda dapat melakukan percobaan hingga Anda melakukannya dengan benar, misalnya:
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;>
Ternyata saya berusaha terlalu keras sebelumnya untuk mempertahankan tanda kutip ganda di sekitar string koneksi. Tampaknya itu tidak perlu karena bahkan cmd.exe akan menghapusnya.
BTW, topi ke tim PowerShell. Mereka cukup membantu dalam menunjukkan kepada saya mantra spesifik dari harga tunggal & ganda untuk mendapatkan hasil yang diinginkan - jika Anda perlu mempertahankan tanda kutip ganda internal di tempat. :-) Mereka juga menyadari ini adalah area rasa sakit, tetapi mereka didorong oleh jumlah orang yang terkena masalah tertentu. Jika ini adalah area yang menyakitkan bagi Anda, silakan pilih pengiriman bug PowerShell ini .
Untuk informasi lebih lanjut tentang bagaimana PowerShell mem-parsing, lihat seri blog PowerShell Efektif saya - khususnya item 10 - "Memahami Mode Parsing PowerShell"
UPDATE 4/4/2012: Situasi ini semakin mudah ditangani di PowerShell V3. Lihat posting blog ini untuk detailnya .