Saya dapat menyatakan kebutuhan saya dengan skenario berikut: Tulis fungsi yang menerima string untuk dijalankan sebagai perintah asli.
Itu tidak terlalu jauh dari sebuah ide: jika Anda berinteraksi dengan utilitas baris perintah lainnya dari tempat lain di perusahaan yang memasok Anda dengan perintah untuk menjalankan kata demi kata. Karena Anda tidak mengontrol perintah, Anda harus menerima perintah yang valid sebagai masukan . Ini adalah masalah utama yang tidak bisa saya atasi dengan mudah:
Perintah mungkin menjalankan program yang hidup di jalur dengan spasi di dalamnya:
$command = '"C:\Program Files\TheProg\Runit.exe" Hello';
Perintah mungkin memiliki parameter dengan spasi di dalamnya:
$command = 'echo "hello world!"';
Perintah ini mungkin memiliki kutu tunggal dan ganda:
$command = "echo `"it`'s`"";
Apakah ada setiap cara yang bersih untuk mencapai ini? Saya hanya bisa menyusun solusi yang boros dan jelek, tetapi untuk bahasa scripting saya merasa ini harus sederhana.
sumber
eval
hal setengah bercanda karena itulah yang disebut dalam begitu banyak bahasa scripting lainnya, dan ini bukan pertanyaan pertama yang saya lihat di mana seseorang tidak tahuinvoke-expression
. Dan kasus OP terdengar seperti skrip in-house saja.Invoke-Expression "& $command"
Silakan lihat juga laporan Microsoft Connect ini pada dasarnya, betapa sulitnya menggunakan PowerShell untuk menjalankan perintah shell (oh, ironi).
http://connect.microsoft.com/PowerShell/feedback/details/376207/
Mereka menyarankan menggunakan
--%
sebagai cara untuk memaksa PowerShell untuk berhenti mencoba menafsirkan teks ke kanan.Sebagai contoh:
sumber
Jawaban yang diterima tidak berfungsi untuk saya ketika mencoba mem-parsing registri untuk mencopot pemasangan string, dan menjalankannya. Ternyata saya tidak membutuhkan panggilan untuk
Invoke-Expression
semua.Saya akhirnya menemukan template yang bagus ini untuk melihat cara menjalankan string uninstall:
Ini berfungsi untuk saya, yaitu karena
$app
aplikasi in-house yang saya tahu hanya akan memiliki dua argumen. Untuk string uninstall yang lebih kompleks, Anda mungkin ingin menggunakan operator gabungan . Juga, saya baru saja menggunakan hash-map, tapi sungguh, Anda mungkin ingin menggunakan array.Juga, jika Anda memiliki banyak versi dari aplikasi yang sama diinstal, uninstaller ini akan menggilir semuanya sekaligus, yang membingungkan
MsiExec.exe
, jadi ada itu juga.sumber
Jika Anda ingin menggunakan operator panggilan, argumen bisa berupa array yang disimpan dalam variabel:
Operator panggilan juga berfungsi dengan objek ApplicationInfo.
sumber