Cara menjalankan file EXE di PowerShell dengan parameter dengan spasi dan tanda kutip

333

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 "

Vans
sumber
Lihat juga stackoverflow.com/questions/6224638/…
Ruben Bartelink
Jika maksud Anda litteraly "di PowerShell" (yang saya artikan sebagai "di dalam prompt PowerShell yang ada), maka contoh berikut ini dapat dengan mudah disesuaikan dengan kebutuhan Anda. Perhatikan tidak perlu memisahkan perintah dari parameternya: # 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))
user3785010
Saya tidak tahu cara menggunakan "mini-markdown" untuk mengedit komentar di atas untuk membuat setiap baris kode muncul pada baris yang terpisah dan batas waktu 5 menit untuk mengedit komentar asli telah kedaluwarsa. Jika ada yang tahu sekarang untuk menggunakan "mini-Markdown" untuk memperbaiki masalah, saya akan memposting ulang dalam bentuk yang lebih mudah dibaca. Baris pertama seharusnya hanya sebagai berikut: # Tampilkan pembaruan yang tersedia untuk paket npm yang diinstal secara global menggunakan alat npm-check-updates
user3785010

Jawaban:

347

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 .

Keith Hill
sumber
1
jika menggunakan sebagai contoh kedua, saya mendapatkan kesalahan ini: Kesalahan: Argumen yang tidak dikenali '"-sumber: dbfullsql =" "" Data'. Semua argumen harus dimulai dengan "-".
Vans
2
Maaf, saya tidak mengerti. Saya melihat bahwa, saat ini, 6 orang telah memilih jawaban sehingga saya kehilangan sesuatu yang jelas, tetapi apa jawaban yang sebenarnya? Apakah ada aturan khusus untuk mengetahui tentang parameter dengan spasi dengan PowerShell, atau Anda hanya menyarankan untuk mengambil kasus per kasus, menggunakan EchoArgs untuk membantu?
Tyler Collier
Mengutip argumen biasanya cukup tetapi tidak selalu. Dalam kasus-kasus di mana itu tidak berfungsi, menggunakan echoargsmemberi indikasi bagaimana PowerShell menafsirkan argumen sebelum meneruskannya ke EXE.
Bukit Keith
1
Apakah Anda tahu bagaimana saya akan melakukan ini dalam file .bat? Saya mencoba & '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.'
Joe Zim
Lupakan. Ditemukan:START C:\"Program Files"\"Sublime Text 3"\sublime_text.exe
Joe Zim
61

Tambahkan saja & operator sebelum nama .exe. Berikut adalah perintah untuk menginstal SQL Server Express dalam mode diam:

$fileExe = "T:\SQLEXPRADV_x64_ENU.exe"
$CONFIGURATIONFILE = "T:\ConfSetupSql2008Express.ini"

& $fileExe  /CONFIGURATIONFILE=$CONFIGURATIONFILE
nonolde1er
sumber
53

Saya memiliki spasi dalam perintah dan parameter, dan inilah yang bekerja untuk saya:

$Command = "E:\X64\Xendesktop Setup\XenDesktopServerSetup.exe"
$Parms = "/COMPONENTS CONTROLLER,DESKTOPSTUDIO,DESKTOPDIRECTOR,LICENSESERVER,STOREFRONT /PASSIVE /NOREBOOT /CONFIGURE_FIREWALL /NOSQL"

$Prms = $Parms.Split(" ")
& "$Command" $Prms

Ini pada dasarnya sama dengan jawaban Akira, tetapi ini bekerja jika Anda secara dinamis membangun parameter perintah Anda dan memasukkannya ke dalam variabel.

Microb
sumber
2
imho ini yang terbaik! tidak ada base64, tidak aneh -% sintaks yang mengubah substitusi, aturan substitusi powershell normal, tidak ada kebingungan, sangat mudah dibaca.
AnneTheAgile
1
Ini tidak berfungsi. Jika parameter Anda memiliki nama jalur di dalamnya, nama jalur akan dibagi menjadi beberapa parameter.
BrainSlugs83
1
Jawaban bagus. Namun, apakah ini akan bekerja dengan tanda kutip di parameter?
Akira Yamamoto
Silakan coba ini, setelah semua yang lain ini benar-benar berhasil. Dan juga menggunakan Powershell ExtensionEchoArgs
Jeremy Thompson
34

Ini bekerja untuk saya:

& 'D:\Server\PSTools\PsExec.exe' @('\\1.1.1.1', '-accepteula', '-d', '-i', $id, '-h', '-u', 'domain\user', '-p', 'password', '-w', 'C:\path\to\the\app', 'java', '-jar', 'app.jar')

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.

Akira Yamamoto
sumber
2
Array jelas merupakan pilihan terbaik - ini bekerja baik untuk saya. Kecuali saya melewati variabel array karena argumen saya dinamis. Terima kasih.
Jon Barker
Solusi terbaik IMHO
Vasin Yuriy
25

Ada beberapa metode yang dapat Anda gunakan untuk melakukannya.

Ada metode lain seperti menggunakan Operator Panggilan ( & ), cmdlet Invoke-Expression dll. Tetapi mereka dianggap tidak aman. Microsoft merekomendasikan menggunakan Mulai-Proses .

Metode 1

Contoh sederhana

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root","-proot","-h localhost"

Dalam kasus Anda

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-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"

Dalam metode ini Anda memisahkan setiap parameter di ArgumentList menggunakan koma.

Metode 2

Contoh sederhana

Start-Process -NoNewWindow -FilePath "C:\wamp64\bin\mysql\mysql5.7.19\bin\mysql" -ArgumentList "-u root -proot -h localhost"

Dalam kasus Anda

Start-Process -NoNewWindow -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-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"

Metode ini lebih mudah karena memungkinkan untuk mengetik parameter Anda dalam sekali jalan.

Perhatikan bahwa dalam PowerShell untuk mewakili tanda kutip (") dalam string Anda harus memasukkan aksen kubur (`) (Ini adalah tombol di atas tombol Tab di keyboard AS).

Parameter -NoNewWindow digunakan untuk menampilkan proses baru di jendela konsol saat ini. Secara default Windows PowerShell membuka jendela baru.

Referensi: Powershell / Scripting / Mulai-Proses

Missaka Iddamalgoda
sumber
Sederhana selalu menang! Terima kasih.
Mike Casas
Terima kasih atas catatan terakhir untuk lolos dari tanda kutip!
Paolo
13

Jika seseorang bertanya-tanya bagaimana cara menjalankan file yang dapat dieksekusi:

.....>. \ file.exe

atau

......> penuh \ path \ ke \ file.exe

darkgaze
sumber
2
Ini harus menjadi jawaban untuk pertanyaan itu, itu yang kita cari ketika kita mencari dengan kata kunci "Mulai EXE dari PowerShell". Terima kasih !
Jean-Daniel Gasser
2
Bagaimana dengan menjalankan argumen?
SereneWizard
1
@SereneWizard Nah, tambahkan mereka setelah .exe dengan peralihan ruang. Contoh:. \ File.exe param1 param2
param3
9

Saya bisa menjalankan perintah serupa dengan menggunakan pendekatan berikut:

msdeploy.exe -verb=sync "-source=dbFullSql=Server=THESERVER;Database=myDB;UID=sa;Pwd=saPwd" -dest=dbFullSql=c:\temp\test.sql

Untuk perintah Anda (tidak banyak membantu sekarang), semuanya akan terlihat seperti ini:

msdeploy.exe -verb=sync "-source=dbfullsql=Server=mysource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;" "-dest=dbfullsql=Server=mydestsource;Trusted_Connection=false;UID=sa;Pwd=sapass!;Database=mydb;",computername=10.10.10.10,username=administrator,password=adminpass

Poin kuncinya adalah:

  • Gunakan kutipan di sekitar argumen sumber, dan hapus tanda kutip yang tertanam di sekitar string koneksi
  • Gunakan nama kunci alternatif dalam membangun string koneksi SQL yang tidak memiliki spasi di dalamnya. Misalnya, gunakan "UID" alih-alih "User Id", "Server", bukan "Sumber Data", "Trusted_Connection" alih-alih "Keamanan Terpadu", dan sebagainya. Saya hanya bisa membuatnya berfungsi setelah saya menghapus semua spasi dari string koneksi.

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.

G-Mac
sumber
2
Saya mencoba semua jawaban lain, tetapi ini adalah satu-satunya jawaban yang berhasil untuk saya! Terima kasih telah menyediakan jalur alternatif ini.
Sentient
6

String pelarian baru di PowerShell V3, dikutip dari Fitur Bahasa V3 Baru :

Penggunaan Kembali Baris Perintah Lebih Mudah Dari Cmd.exe

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:

PS> echoargs.exe --% %USERNAME%,this=$something{weird}
Arg 0 is <jason,this=$something{weird}>
Loïc MICHEL
sumber
6

Kamu bisa memakai:

Start-Process -FilePath "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe" -ArgumentList "-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"

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, ya Get-Help Start-Process -Detailed.

CyrilDex
sumber
5

Saya mencoba semua saran tetapi masih tidak dapat berjalan msiexec.exedengan parameter yang berisi spasi. Jadi solusi saya akhirnya menggunakan System.Diagnostics.ProcessStartInfo:

# can have spaces here, no problems
$settings = @{
  CONNECTION_STRING = "... ..."
  ENTITY_CONTEXT = "... ..."
  URL = "..."
}

$settingsJoined = ($settings.Keys | % { "$_=""$($settings[$_])""" }) -join " "
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
$pinfo.WorkingDirectory = $ScriptDirectory
$pinfo.FileName = "msiexec.exe"
$pinfo.RedirectStandardError = $true
$pinfo.RedirectStandardOutput = $true
$pinfo.UseShellExecute = $false
$pinfo.Arguments = "/l* install.log /i installer.msi $settingsJoined"
$p = New-Object System.Diagnostics.Process
$p.StartInfo = $pinfo
$p.Start() | Out-Null
$p.WaitForExit()
$stdout = $p.StandardOutput.ReadToEnd()
Daniel Lidström
sumber
3

Ini bekerja untuk saya:

PowerShell.exe -Command "& ""C:\Some Script\Path With Spaces.ps1"""

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

Tony Wall
sumber
1
Ini tidak terkait dengan pertanyaan ops, ia secara khusus bertanya bagaimana menjalankan perintah panjang di posnya di PowerShell. Bukan cara menjalankan skrip PowerShell dengan spasi di jalur file.
leinad13
Baca judul pertanyaan, spasi tidak terlalu panjang. Ini adalah salah satu jawaban yang valid untuk masalah-masalah seperti itu sehingga berbagi bermanfaat. Apakah Anda memiliki masalah yang sama dan benar-benar mencobanya? Jika Anda ingin memperbaikinya kirimkan edit yang menyertakan perintah sebenarnya dalam pertanyaan dan saya akan menerimanya.
Tony Wall
3

Jawaban alternatif adalah dengan menggunakan saklar perintah yang disandikan Base64 :

powershell -EncodedCommand "QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA=="

Saat diterjemahkan, Anda akan melihat bahwa cuplikan asli OP dengan semua argumen dan tanda kutip ganda dipertahankan.

powershell.exe -EncodedCommand

Accepts a base-64-encoded string version of a command. Use this parameter
to submit commands to Windows PowerShell that require complex quotation
marks or curly braces.

Perintah asli:

 C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -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"

Itu berubah menjadi ini ketika disandikan sebagai Base64:

QwA6AFwAUAByAG8AZwByAGEAbQAgAEYAaQBsAGUAcwBcAEkASQBTAFwATQBpAGMAcgBvAHMAbwBmAHQAIABXAGUAYgAgAEQAZQBwAGwAbwB5AFwAbQBzAGQAZQBwAGwAbwB5AC4AZQB4AGUAIAAtAHYAZQByAGIAOgBzAHkAbgBjACAALQBzAG8AdQByAGMAZQA6AGQAYgBmAHUAbABsAHMAcQBsAD0AIgBEAGEAdABhACAAUwBvAHUAcgBjAGUAPQBtAHkAcwBvAHUAcgBjAGUAOwBJAG4AdABlAGcAcgBhAHQAZQBkACAAUwBlAGMAdQByAGkAdAB5AD0AZgBhAGwAcwBlADsAVQBzAGUAcgAgAEkARAA9AHMAYQA7AFAAdwBkAD0AcwBhAHAAYQBzAHMAIQA7AEQAYQB0AGEAYgBhAHMAZQA9AG0AeQBkAGIAOwAiACAALQBkAGUAcwB0ADoAZABiAGYAdQBsAGwAcwBxAGwAPQAiAEQAYQB0AGEAIABTAG8AdQByAGMAZQA9AC4AXABtAHkAZABlAHMAdABzAG8AdQByAGMAZQA7AEkAbgB0AGUAZwByAGEAdABlAGQAIABTAGUAYwB1AHIAaQB0AHkAPQBmAGEAbABzAGUAOwBVAHMAZQByACAASQBEAD0AcwBhADsAUAB3AGQAPQBzAGEAcABhAHMAcwAhADsARABhAHQAYQBiAGEAcwBlAD0AbQB5AGQAYgA7ACIALABjAG8AbQBwAHUAdABlAHIAbgBhAG0AZQA9ADEAMAAuADEAMAAuADEAMAAuADEAMAAsAHUAcwBlAHIAbgBhAG0AZQA9AGEAZABtAGkAbgBpAHMAdAByAGEAdABvAHIALABwAGEAcwBzAHcAbwByAGQAPQBhAGQAbQBpAG4AcABhAHMAcwAiAA==

dan inilah cara mereplikasi di rumah:

$command = 'C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe -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"'
$bytes = [System.Text.Encoding]::Unicode.GetBytes($command)
$encodedCommand = [Convert]::ToBase64String($bytes)
$encodedCommand

#  The clip below copies the base64 string to your clipboard for right click and paste.
$encodedCommand | Clip
Knuckle-Dragger
sumber
3

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:

$extract_path = "C:\Program Files\Containing folder";
$rar_to_extract = "C:\Path_to_arch\file.rar"; #(or.exe if its a big file)  
C:\Path_here\Unrar.exe x -o+ -c- $rar_to_extract $extract_path;

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:

> $vmname = "misae_unrtes_1234123"; #(name too long, we want to change this)
> & 'C:\Program Files\Oracle\VirtualBox\VBoxManage.exe' modifyvm $vmname --name UBUNTU;

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).

> Invoke-Command -ScriptBlock { C:\Your-path\archivefile.exe /S };

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.

Andy McRae
sumber
1

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:

                    # function with one argument will flatten 
                    # all passed-in entries into 1 single string line
Function Execute($command) {
                    # execute:
    Invoke-Expression $command;
                    # if you have trouble try:
  # Invoke-Expression "& $command";
                    # or if you need also output to a variable
  # Invoke-Expression $command | Tee-Object -Variable cmdOutput;

}

#  ... your main code here ...

               # The name of your executable app
$app = 'my_app.exe';
               # List of arguments:
               #    Notice the type of quotes - important !
               #    Those in single quotes are normal strings, like 'Peter'
$args = 'arg1',
        'arg2',
        $some_variable,
        'arg4',
        "arg5='with quotes'",
        'arg6',
        "arg7 \ with \ $other_variable",
        'etc...';

               # pass all arguments inside double quotes
Execute "$app $args";
Felix
sumber
1

Saya memiliki kode berikut yang berfungsi sempurna di laptop saya:

& $msdeploy `
-source:package="$publishFile" `
-dest:auto,computerName="$server",includeAcls="False",UserName="$username",Password="$password",AuthType="$auth" `
-allowUntrusted  `
-verb:sync  `
-enableRule:DoNotDeleteRule `
-disableLink:AppPoolExtension  `
-disableLink:ContentExtension  `
-disableLink:CertificateExtension  `
-skip:objectName=filePath,absolutePath="^(.*Web\.config|.*Environment\.config)$" `
-setParam:name=`"IIS Web Application Name`",value="$appName"

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.

drizin
sumber
1

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

$env:path += ';C:\Program Files\IIS\Microsoft Web Deploy\'
msdeploy

2) mengutip kembali spasi:

C:\Program` Files\IIS\Microsoft` Web` Deploy\msdeploy.exe
js2010
sumber
0

Jadi, saya mengalami masalah yang sama dan memilih untuk menyelesaikannya dengan cara ini sebagai gantinya:

  1. Keluar dari karakter kutipan (") Anda dengan backtick (`)
  2. Kelilingi ekspresi baru Anda dengan tanda kutip (")
  3. Dengan menggunakan operator panggilan (&), berikan perintah invoke-expressionpada string baru

Contoh solusi:

& {invoke-expression "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 = false; ID Pengguna = sa; Pwd = sapass!; Database = mydb; `", computername = 10.10.10.10,, username = administrator, kata sandi = adminpass` ""}

Randall Borck
sumber
0

Untuk nama yang dapat dieksekusi, cmdlet alias baru dapat digunakan untuk menghindari berurusan dengan spasi atau perlu menambahkan yang dapat dieksekusi ke lingkungan $ PATH.

PS> new-alias msdeploy "C:\Program Files\IIS\Microsoft Web Deploy\msdeploy.exe"
PS> msdeploy ...

Untuk membuat daftar atau memodifikasi alias PS juga lihat

PS> get-alias
PS> set-alias

Dari Jeffery Hicks Aarticle

Jawaban lain membahas argumen.

crokusek
sumber