Bash memiliki <(..)
proses substitusi. Apa yang setara dengan Powershell?
Saya tahu ada $(...)
, tetapi mengembalikan sebuah string, sementara <(..)
mengembalikan file yang bisa dibaca oleh perintah luar, seperti yang diharapkan.
Saya juga tidak mencari solusi berbasis pipa, tetapi sesuatu yang bisa saya tempel di tengah baris perintah.
powershell
IttayD
sumber
sumber
Write-Output "The BITS service is $(Get-Service bits | select -ExpandProperty Stauts)"
untuk mendapatkan status layanan BITS tanpa memuatnya ke dalam variabel terlebih dahulu. Melihat Substitusi Proses, ini tidak persis sama, tetapi mungkin masih memecahkan masalah yang Anda hadapipsftp.exe
untuk transfer SFTP:-b
opsinya mengharuskan Anda untuk memberikan perintah untuk dijalankan di server melalui file , yang tidak nyaman, jika Anda hanya ingin menjalankan, katakanlahmget *
,. Jika PowerShell memiliki proses substitusi, Anda akan dapat melakukan sesuatu sepertipsftp.exe -l user -p password somehost -b <( "mget *" )
.Jawaban:
Jawaban ini BUKAN untuk Anda , jika Anda:
- jarang, jika pernah, perlu menggunakan CLI eksternal (yang umumnya layak diperjuangkan - perintah PowerShell-asli bermain lebih baik bersama-sama dan tidak memerlukan fitur seperti itu).
- tidak terbiasa dengan proses substitusi Bash.
Jawaban ini ADALAH untuk Anda , jika Anda:
- sering menggunakan CLI eksternal (apakah karena kebiasaan atau karena kurangnya (baik) alternatif PowerShell-asli), terutama saat menulis skrip.
- Digunakan untuk dan menghargai apa yang bisa dilakukan oleh proses substitusi Bash.
- Pembaruan : Sekarang PowerShell didukung pada platform Unix juga, fitur ini semakin menarik - lihat permintaan fitur ini di GitHub, yang menunjukkan bahwa PowerShell mengimplementasikan fitur yang mirip dengan proses substitusi.
Di dunia Unix, di Bash / Ksh / Zsh, subtitusi proses menawarkan memperlakukan output perintah seolah-olah itu adalah file sementara yang membersihkan setelah itu sendiri; misalnya
cat <(echo 'hello')
, di manacat
melihat output dariecho
perintah sebagai jalur file sementara yang berisi output perintah .Sementara perintah PowerShell-asli tidak membutuhkan fitur seperti itu, itu bisa berguna ketika berhadapan dengan CLI eksternal .
Meniru fitur di PowerShell rumit , tetapi mungkin sepadan, jika Anda sering membutuhkannya.
Bayangkan sebuah fungsi bernama
cf
yang menerima blok skrip, menjalankan blok dan menulis hasilnya ke temp. file dibuat sesuai permintaan, dan mengembalikan temp. jalur file ; misalnya:Ini adalah contoh sederhana yang tidak menggambarkan perlunya fitur tersebut dengan baik. Mungkin skenario yang lebih meyakinkan adalah penggunaan
psftp.exe
untuk transfer SFTP: penggunaan batch-nya (otomatis) mengharuskan menyediakan file input yang berisi perintah yang diinginkan, sedangkan perintah seperti itu dapat dengan mudah dibuat sebagai string dengan cepat.Agar kompatibel dengan utilitas eksternal sebanyak mungkin, temp. file harus menggunakan UTF-8 encoding tanpa BOM (byte-order mark) secara default, meskipun Anda dapat meminta BOM UTF-8 dengan
-BOM
, jika diperlukan.Sayangnya, aspek pembersihan otomatis dari substitusi proses tidak dapat ditiru secara langsung , sehingga diperlukan panggilan pembersihan secara eksplisit ; pembersihan dilakukan dengan memanggil
cf
tanpa argumen :Untuk penggunaan interaktif , Anda dapat mengotomatiskan pembersihan dengan menambahkan panggilan pembersihan ke
prompt
fungsi Anda sebagai berikut (prompt
fungsi mengembalikan string prompt , tetapi juga dapat digunakan untuk melakukan perintah di belakang layar setiap kali prompt ditampilkan, mirip dengan Bash's$PROMPT_COMMAND
variabel); untuk ketersediaan dalam sesi interaktif apa pun, tambahkan berikut ini serta definisi dicf
bawah ini untuk profil PowerShell Anda:Untuk digunakan dalam skrip , untuk memastikan bahwa pembersihan dilakukan, blok yang menggunakan
cf
- berpotensi keseluruhan skrip - perlu dibungkus dengantry
/finally
blok, di manacf
tanpa argumen dipanggil untuk pembersihan:Inilah implementasinya : fungsi lanjutan
ConvertTo-TempFile
dan alias ringkasnyacf
:Catatan : Penggunaan
New-Module
, yang membutuhkan PSv3 +, untuk mendefinisikan fungsi melalui modul dinamis memastikan bahwa tidak ada konflik variabel antara parameter fungsi dan variabel yang dirujuk di dalam blok skrip yang diteruskan.Perhatikan kemampuan untuk secara opsional menentukan jalur [file] keluaran dan / atau ekstensi nama file.
sumber
psftp.exe
, itulah yang mendorong saya untuk menulisnya. Meskipun lebih baik melakukan semuanya secara asli di PowerShell, itu tidak selalu mungkin; menjalankan CLI eksternal dari PowerShell akan dan akan terus terjadi; jika Anda menemukan diri Anda berulang kali berurusan dengan CLI yang memerlukan input file yang (lebih) mudah dibangun di memori / dengan perintah lain, fungsi dalam jawaban ini dapat membuat hidup Anda lebih mudah.Ketika tidak dilampirkan dalam tanda kutip ganda,
$(...)
mengembalikan Objek PowerShell (atau lebih tepatnya, apa pun yang dikembalikan oleh kode terlampir), mengevaluasi kode terlampir terlebih dahulu. Ini harus sesuai untuk keperluan Anda ("sesuatu [saya] dapat tetap di tengah-tengah baris perintah"), dengan asumsi bahwa baris perintah adalah PowerShell.Anda dapat mengujinya dengan memiparkan berbagai versi ke
Get-Member
, atau bahkan langsung mengeluarkannya.Ketika dilampirkan dalam tanda kutip ganda, seperti yang Anda perhatikan, `" $ (...) "hanya akan mengembalikan sebuah string.
Dengan cara ini, jika Anda ingin menyisipkan, katakanlah, isi file langsung pada sebuah baris, Anda bisa menggunakan sesuatu seperti:
sumber
Get-Content <(Get-ChildItem)
Get-ChildItem | Get-Content
berfungsi dengan baik? Atau Anda dapat mencobaGet-Content (Get-ChildItem).FullName
efek yang sama? Anda mungkin mendekati ini dari pandangan yang sepenuhnya dipengaruhi oleh pendekatan skrip lain.