Di Linux, saya dapat melakukan:
$ FOO=BAR ./myscript
untuk memanggil "myscript" dengan variabel lingkungan FOO sedang disetel.
Apakah sesuatu yang serupa mungkin terjadi di PowerShell, yaitu tanpa harus mengatur variabel terlebih dahulu, memanggil perintah, dan kemudian menghapus variabel lagi?
Agar lebih jelas tentang kasus penggunaan saya - Saya tidak ingin menggunakan ini sebagai bagian dari skrip. Sebaliknya, saya memiliki skrip pihak ketiga yang perilakunya dapat saya kendalikan menggunakan variabel lingkungan, tetapi, dalam kasus ini, bukan argumen baris perintah. Jadi bisa bergantian antar mengetik
$ OPTION=1 ./myscript
dan
$ ./myscript
akan sangat berguna.
windows
powershell
scripting
variables
environment
miracle2k
sumber
sumber
Jawaban:
Secara umum, akan lebih baik untuk meneruskan info ke skrip melalui parameter daripada variabel global (lingkungan). Tetapi jika itu yang perlu Anda lakukan, Anda dapat melakukannya dengan cara ini:
Variabel lingkungan $ env: FOO dapat dihapus nanti seperti:
sumber
env:foo
kembali ke nilai lamanya (mungkin tidak disetel) daripada menghapusnya?& {$pre = $env:foo; $env:foo = 'bar'; ./myscript; if ($pre) {$env:foo = $pre} else {Remove-Item env:\foo}
... beberapa mungkin mengatakan berat , tetapi akan menghindari efek samping ...Saya cukup termotivasi tentang masalah ini sehingga saya melanjutkan dan menulis skrip untuk itu: with-env.ps1
Pemakaian:
Di sisi lain, jika Anda menginstal Gow, Anda dapat menggunakan
env.exe
yang mungkin sedikit lebih kuat daripada skrip cepat yang saya tulis di atas.Pemakaian:
sumber
2 cara mudah melakukannya dalam satu baris:
Baru saja meringkas informasi dari jawaban lain (terima kasih teman-teman) yang tidak mengandung satu kalimat murni untuk beberapa alasan.
sumber
Untuk mencapai padanan sintaks Unix, Anda tidak hanya harus mengatur variabel lingkungan, tetapi Anda harus mengatur ulang ke nilai semula setelah menjalankan perintah. Saya telah menyelesaikan ini untuk perintah umum yang saya gunakan dengan menambahkan fungsi yang mirip dengan berikut ini ke profil PowerShell saya.
Begitu
mycmd
juga beberapa executable yang beroperasi secara berbeda tergantung pada nilai variabel lingkunganapp_master
. Dengan mendefinisikancmd_special
, saya sekarang dapat mengeksekusicmd_special
dari baris perintah (termasuk parameter lain) denganapp_master
variabel lingkungan set ... dan itu akan direset (atau bahkan tidak disetel) setelah eksekusi perintah.Agaknya, Anda juga bisa melakukan ad-hoc ini untuk satu doa.
Seharusnya lebih mudah dari ini, tetapi tampaknya ini bukan kasus penggunaan yang sudah didukung oleh PowerShell. Mungkin versi yang akan datang (atau fungsi pihak ketiga) akan memfasilitasi kasus penggunaan ini. Alangkah baiknya jika PowerShell memiliki cmdlet yang akan melakukan ini, misalnya:
Mungkin seorang guru PowerShell dapat menyarankan bagaimana seseorang dapat menulis cmdlet semacam itu.
sumber
Mengingat CMD adalah CLI asli pada kernel Windows (dan masih merupakan antarmuka otomatisasi untuk banyak alat), Anda dapat menjalankan skrip PowerShell Anda dengan
powershell.exe
dari prompt CMD atau antarmuka yang menerima pernyataan konsol CMD.Jika Anda menggunakan
-File
parameter untuk meneruskan skrip Andapowershell.exe
, tidak ada kode PowerShell lain yang dapat digunakan untuk menyetel variabel lingkungan untuk diakses skrip, jadi Anda dapat menyetel variabel lingkungan Anda di lingkungan CMD sebelum memanggilpowershell.exe
:Satu
&
juga akan berfungsi, tetapi akan memungkinkan perintah untuk melanjutkan jikaset
gagal karena beberapa alasan. (Apakah ini mungkin? Saya tidak tahu.)Selain itu, mungkin lebih aman untuk memasukkan
"foo=bar"
tanda kutip sehingga tidak ada yang mengikuti yang diteruskanset
sebagai konten variabel.sumber
https://gist.github.com/bobalob/6632690e33747c13a8c00875ee686be2
sumber
Anda dapat mengatur variabel ke fungsi dan skrip.
New-Variable juga memiliki parameter -scope jika Anda ingin formal dan mendeklarasikan variabel Anda menggunakan variabel-baru.
sumber