Bagaimana Anda menjalankan perintah berikut di PowerShell?
C: \ Program Files \ IIS \ Microsoft Web Deploy \ msdeploy.exe -verb: sync -source: dbfullsql = "Sumber Data = mysource; Keamanan Terpadu = false; ID Pengguna = sa; Pwd = sapass!; Database = mydb;" -dest: dbfullsql = "Sumber Data =. \ mydestsource; Keamanan Terpadu = salah; ID Pengguna = sa; Pwd = sapass!; Database = mydb;", nama pengguna = 10.10.10.10, nama pengguna = administrator, kata sandi = adminpass "
# Show any available updates to globally installed npm packages using the npm-check-updates tool [string] $cmd = 'ncu -g' Write-Verbose -Message $cmd Invoke-Command -ScriptBlock ([ScriptBlock]::Create($cmd))
Jawaban:
Ketika PowerShell melihat perintah yang dimulai dengan string, ia hanya mengevaluasi string, yaitu, biasanya menggemakannya ke layar, misalnya:
Jika Anda ingin PowerShell mengartikan string sebagai nama perintah, gunakan operator panggilan (&) seperti:
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:
Dengan menggunakan echoarg, Anda dapat melakukan percobaan hingga Anda melakukannya dengan benar, misalnya:
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 .
sumber
echoargs
memberi indikasi bagaimana PowerShell menafsirkan argumen sebelum meneruskannya ke EXE.& 'C:\Program Files\Sublime Text 3\sublime_text.exe'
langsung di konsol dan berfungsi, tetapi dalam file batch saya mendapatkan kesalahan mengatakan '& tidak terduga saat ini.'START C:\"Program Files"\"Sublime Text 3"\sublime_text.exe
Tambahkan saja & operator sebelum nama .exe. Berikut adalah perintah untuk menginstal SQL Server Express dalam mode diam:
sumber
Saya memiliki spasi dalam perintah dan parameter, dan inilah yang bekerja untuk saya:
Ini pada dasarnya sama dengan jawaban Akira, tetapi ini bekerja jika Anda secara dinamis membangun parameter perintah Anda dan memasukkannya ke dalam variabel.
sumber
EchoArgs
Ini bekerja untuk saya:
Cukup letakkan jalur atau string koneksi dalam satu item array dan pisahkan hal-hal lain dalam satu item array masing-masing.
Ada banyak opsi lain di sini: https://social.technet.microsoft.com/wiki/contents/articles/7703.powershell-running-executables.aspx
Microsoft harus membuat cara ini lebih sederhana dan kompatibel dengan sintaks prompt perintah.
sumber
Ada beberapa metode yang dapat Anda gunakan untuk melakukannya.
Metode 1
Contoh sederhana
Dalam kasus Anda
Dalam metode ini Anda memisahkan setiap parameter di ArgumentList menggunakan koma.
Metode 2
Contoh sederhana
Dalam kasus Anda
Metode ini lebih mudah karena memungkinkan untuk mengetik parameter Anda dalam sekali jalan.
Referensi: Powershell / Scripting / Mulai-Proses
sumber
Lihat halaman ini: https://slai.github.io/posts/powershell-and-external-commands-done-right/
Ringkasan menggunakan vshadow sebagai executable eksternal:
sumber
Jika seseorang bertanya-tanya bagaimana cara menjalankan file yang dapat dieksekusi:
.....>. \ file.exe
atau
......> penuh \ path \ ke \ file.exe
sumber
Saya bisa menjalankan perintah serupa dengan menggunakan pendekatan berikut:
Untuk perintah Anda (tidak banyak membantu sekarang), semuanya akan terlihat seperti ini:
Poin kuncinya adalah:
Saya tidak mencoba menambahkan bagian "nama pengguna" di akhir baris perintah, tetapi semoga info ini akan membantu orang lain yang membaca ini sekarang semakin mendekati hasil yang diinginkan.
sumber
String pelarian baru di PowerShell V3, dikutip dari Fitur Bahasa V3 Baru :
Web ini penuh dengan baris perintah yang ditulis untuk Cmd.exe. Baris perintah ini cukup sering bekerja di PowerShell, tetapi ketika mereka menyertakan karakter tertentu, misalnya, tanda titik koma (;), tanda dolar ($), atau kurung kurawal, Anda harus membuat beberapa perubahan, mungkin menambahkan beberapa tanda kutip. Ini tampaknya menjadi sumber banyak sakit kepala ringan.
Untuk membantu mengatasi skenario ini, kami menambahkan cara baru untuk "melarikan diri" dari penguraian baris perintah. Jika Anda menggunakan parameter ajaib -%, kami menghentikan penguraian normal baris perintah Anda dan beralih ke sesuatu yang lebih sederhana. Kami tidak cocok dengan kutipan. Kami tidak berhenti di titik koma. Kami tidak memperluas variabel PowerShell. Kami memperluas variabel lingkungan jika Anda menggunakan sintaks Cmd.exe (mis.% TEMP%). Selain itu, argumen hingga akhir baris (atau pipa, jika Anda perpipaan) dilewatkan begitu saja. Berikut ini sebuah contoh:
sumber
Kamu bisa memakai:
Hal utama yang perlu diperhatikan di sini adalah bahwa FilePath harus berada di posisi 0, menurut Panduan Bantuan. Untuk memohon panduan Bantuan untuk commandlet, cukup ketik
Get-Help <Commandlet-name> -Detailed
. Dalam hal ini, yaGet-Help Start-Process -Detailed
.sumber
Saya mencoba semua saran tetapi masih tidak dapat berjalan
msiexec.exe
dengan parameter yang berisi spasi. Jadi solusi saya akhirnya menggunakanSystem.Diagnostics.ProcessStartInfo
:sumber
Ini bekerja untuk saya:
Kuncinya tampaknya adalah bahwa seluruh perintah terlampir dalam tanda kutip luar, "&" ampersand digunakan untuk menentukan file perintah anak lain sedang dieksekusi, kemudian akhirnya lolos (dua kali lipat-dua) kutipan di sekitar path / nama file dengan spasi Anda ingin mengeksekusi di tempat pertama.
Ini juga penyelesaian satu-satunya solusi untuk masalah koneksi MS yang -File tidak mengembalikan kode pengembalian non-nol dan -Command adalah satu-satunya alternatif. Tetapi sampai sekarang ia berpikir batasan dari -Command adalah tidak mendukung ruang. Saya telah memperbarui item umpan balik itu juga.
http://connect.microsoft.com/PowerShell/feedback/details/750653/powershell-exe-doesn-t-return-correct-exit-codes-when-using-the-file-option
sumber
Jawaban alternatif adalah dengan menggunakan saklar perintah yang disandikan Base64 :
Saat diterjemahkan, Anda akan melihat bahwa cuplikan asli OP dengan semua argumen dan tanda kutip ganda dipertahankan.
Perintah asli:
Itu berubah menjadi ini ketika disandikan sebagai Base64:
dan inilah cara mereplikasi di rumah:
sumber
Anda dapat menjalankan file exe dengan berbagai cara. Misalnya jika Anda ingin menjalankan unrar.exe dan mengekstrak file .rar, Anda cukup menulis di powershell ini:
Tetapi kadang-kadang, ini tidak berfungsi sehingga Anda harus menggunakan & parameter seperti yang ditunjukkan di atas: Misalnya, dengan vboxmanage.exe (alat untuk mengelola mesin virtualbox virtualbox) Anda harus memanggil paramterer di luar string seperti ini, tanpa tanda kutip:
Jika Anda ingin memanggil file winrar yang diarsipkan sebagai file .exe, Anda juga dapat mengekstraknya dengan cmdlet invoke-command dan parameter Diam / S (Ini akan mengekstrak dirinya dalam folder yang sama daripada di mana ia telah dikompresi).
Jadi ada beberapa cara untuk menjalankan file .exe dengan argumen di PowerShell.
Kadang-kadang, seseorang harus menemukan solusi untuk membuatnya berfungsi dengan baik, yang dapat membutuhkan usaha dan rasa sakit lebih lanjut :) tergantung pada cara .exe telah dikompilasi atau dibuat bi penciptanya.
sumber
Saya menggunakan metode sederhana, bersih dan efektif ini.
Saya menempatkan argumen dalam array, 1 per baris. Dengan cara ini sangat mudah dibaca dan diedit. Lalu saya menggunakan trik sederhana untuk melewatkan semua argumen di dalam tanda kutip ganda ke fungsi dengan 1 parameter tunggal. Itu meratakan mereka, termasuk array, ke string tunggal, yang kemudian saya jalankan menggunakan PS 'Invoke-Expression'. Arahan ini dirancang khusus untuk mengubah string menjadi perintah runnable. Bekerja dengan baik:
sumber
Saya memiliki kode berikut yang berfungsi sempurna di laptop saya:
Kemudian ketika saya mencoba menjalankannya secara langsung di satu server saya mulai mendapatkan kesalahan-kesalahan itu
"Unrecognized argument ...etc.... All arguments must begin with "-". "
Setelah mencoba semua solusi yang mungkin (tidak berhasil), saya menemukan bahwa Powershell di server (Windows 2008 R2) adalah versi 3.0, sedangkan laptop saya memiliki versi 5.0. (Anda dapat menggunakan "$ PSVersionTable" untuk melihat versi).
Setelah memutakhirkan Powershell ke versi terbaru, mulai berfungsi kembali.
sumber
Cmd dapat menangani menjalankan exe yang dikutip, tetapi Powershell tidak bisa. Saya hanya akan berurusan dengan menjalankan exe itu sendiri, karena saya tidak memilikinya. Jika Anda benar-benar perlu mengirim tanda kutip ke argumen perintah eksternal, itu masalah lain yang telah dibahas di tempat lain.
1) tambahkan folder exe ke jalur Anda, mungkin di $ profil Anda
2) mengutip kembali spasi:
sumber
Jadi, saya mengalami masalah yang sama dan memilih untuk menyelesaikannya dengan cara ini sebagai gantinya:
invoke-expression
pada string baruContoh solusi:
sumber
Untuk nama yang dapat dieksekusi, cmdlet alias baru dapat digunakan untuk menghindari berurusan dengan spasi atau perlu menambahkan yang dapat dieksekusi ke lingkungan $ PATH.
Untuk membuat daftar atau memodifikasi alias PS juga lihat
Dari Jeffery Hicks Aarticle
Jawaban lain membahas argumen.
sumber