Saya ingin skrip PowerShell saya mencetak sesuatu seperti ini:
Enabling feature XYZ......Done
Scriptnya terlihat seperti ini:
Write-Output "Enabling feature XYZ......."
Enable-SPFeature...
Write-Output "Done"
Tetapi Write-Output
selalu mencetak baris baru di akhir sehingga output saya tidak pada satu baris. Apakah ada cara untuk melakukan ini?
powershell
Amit G
sumber
sumber
Jawaban:
sumber
Write-Output
, yang memiliki fungsi yang jauh berbeda dariWrite-Host
. Pembaca harus mencatat perbedaan besar ini sebelum menyalin / menempelkan jawabannya.Write-Host
hampir tidak pernah jawaban yang benar. Ini sama dengan melakukan>/dev/tty
di Unixland.Write-Progress
mungkin sesuai dalam beberapa kasus, lihat contoh di bawah ini.Write-Output
.Write-Output
tidak memiliki-NoNewLine
parameter.Sayangnya, sebagaimana dicatat dalam beberapa jawaban dan komentar,
Write-Host
bisa berbahaya dan tidak dapat disalurkan ke proses lain danWrite-Output
tidak memiliki-NoNewline
bendera.Tetapi metode-metode itu adalah cara "* nix" untuk menampilkan perkembangan, cara "PowerShell" untuk melakukannya
Write-Progress
: menampilkan sebuah bar di bagian atas jendela PowerShell dengan informasi kemajuan, tersedia dari PowerShell 3.0 dan seterusnya, lihat manual untuk detail.Dan untuk mengambil contoh OP:
sumber
Meskipun mungkin tidak berfungsi dalam kasus Anda (karena Anda memberikan output informatif kepada pengguna), buat string yang dapat Anda gunakan untuk menambahkan output. Ketika tiba saatnya untuk meng-output-nya, output saja string.
Tentu saja mengabaikan contoh ini konyol dalam kasus Anda tetapi berguna dalam konsep:
Menampilkan:
sumber
Write-Output
. Solusi yang masuk akal, tetapi bukan solusi.Ya, karena jawaban lain menyatakan, itu tidak dapat dilakukan dengan Write-Output. Di mana PowerShell gagal, buka .NET, bahkan ada beberapa jawaban .NET di sini tetapi lebih kompleks dari yang seharusnya.
Cukup gunakan:
Ini bukan PowerShell yang paling murni, tetapi bekerja.
sumber
Write-Host
, kecuali orang tidak akan mengharapkannya.Untuk menulis ke file Anda dapat menggunakan array byte. Contoh berikut membuat file ZIP kosong, yang dapat Anda tambahkan file ke:
Atau gunakan:
sumber
Penyederhanaan terhadap respons FrinkTheBrave:
sumber
Masalah yang saya tekan adalah bahwa Write-Output sebenarnya linebreak output ketika menggunakan PowerShell v2, setidaknya untuk stdout. Saya mencoba untuk menulis teks XML ke stdout tanpa hasil, karena itu akan sulit terbungkus pada karakter 80.
Solusinya adalah menggunakan
Ini bukan masalah di PowerShell v3. Write-Output tampaknya berfungsi dengan baik di sana.
Bergantung pada bagaimana skrip PowerShell dipanggil, Anda mungkin perlu menggunakan
sebelum Anda menulis ke stdout.
sumber
Sepertinya tidak ada cara untuk melakukan ini di PowerShell. Semua jawaban sebelumnya tidak benar, karena mereka tidak berperilaku seperti itu
Write-Output
tetapi lebih sepertiWrite-Host
yang tidak memiliki masalah ini.Solusi closes sepertinya digunakan
Write-Host
dengan-NoNewLine
parameter. Anda tidak dapat mem-pipe ini yang merupakan masalah secara umum, tetapi ada cara untuk menimpa fungsi ini seperti dijelaskan dalam Write-Host => Ekspor ke file , sehingga Anda dapat dengan mudah membuatnya menerima parameter untuk file output. Ini masih jauh dari solusi yang bagus. DenganStart-Transcript
ini lebih dapat digunakan, tetapi cmdlet itu memiliki masalah dengan aplikasi asli.Write-Output
tidak bisa melakukan apa yang Anda butuhkan dalam konteks umum.sumber
Write-Host
mengerikan, perusak dunia, namun Anda dapat menggunakannya hanya untuk menampilkan kemajuan kepada pengguna saat menggunakanWrite-Output
untuk log (bukan bahwa OP meminta penebangan).sumber
Write-Progress
.Anda tidak bisa mendapatkan PowerShell untuk menghilangkan baris baru yang sial itu ... Tidak ada skrip atau cmdlet yang melakukannya. Tentu saja, Write-Host adalah omong kosong mutlak, karena Anda tidak dapat mengarahkan / pipa darinya!
Namun demikian, Anda dapat menulis file EXE Anda sendiri untuk melakukannya, itulah yang saya jelaskan bagaimana melakukannya di Stack Overflow. Bagaimana cara mengeluarkan sesuatu di PowerShell .
sumber
Jawaban oleh shufler benar. Dinyatakan dengan cara lain: Alih-alih meneruskan nilai ke Write-Output menggunakan FORMULIR ARRAY,
atau setara dengan beberapa panggilan ke Write-Output,
gabungkan komponen Anda menjadi STRING VARIABLE terlebih dahulu:
Ini akan mencegah CRLF perantara yang disebabkan oleh panggilan Write-Output beberapa kali (atau FORMULIR ARRAY), tetapi tentu saja tidak akan menekan CRLF akhir dari commandlet Output-Tulis. Untuk itu, Anda harus menulis commandlet Anda sendiri, menggunakan salah satu dari solusi yang berbelit-belit yang tercantum di sini, atau menunggu hingga Microsoft memutuskan untuk mendukung
-NoNewline
opsi untuk Write-Output.Keinginan Anda untuk memberikan pengukur kemajuan teks ke konsol (yaitu "....") yang bertentangan dengan penulisan ke file log, juga harus dipenuhi dengan menggunakan Write-Host. Anda dapat menyelesaikan keduanya dengan mengumpulkan teks pesan ke dalam variabel untuk ditulis ke log DAN menggunakan Write-Host untuk memberikan kemajuan ke konsol. Fungsi ini dapat digabungkan ke dalam commandlet Anda sendiri untuk penggunaan kembali kode terhebat.
sumber
Write-Output
, Anda tidak dapat melihatnya karena ini adalah hal terakhir yang ditulis. Solusi yang masuk akal, tetapi bukan solusi. Mungkin ada sesuatu yang mengkonsumsi output yang dihasilkan yang tidak dapat menangani baris tambahan.Berikut ini akan menempatkan kursor kembali di awal baris sebelumnya. Terserah Anda untuk meletakkannya di posisi horizontal kanan (menggunakan $ pos.X untuk memindahkannya ke samping):
Output Anda saat ini adalah 27 spasi lebih, jadi $ pos.X = 27 mungkin berfungsi.
sumber
$pos.X
juga. Masalahnya adalah bahwa jika Anda memipangnya ke file, dua baris terpisah muncul.Ini mungkin tidak terlalu elegan, tetapi ia melakukan persis seperti yang diminta OP. Perhatikan bahwa ISE mengacaukan StdOut, sehingga tidak akan ada output. Agar skrip ini berfungsi, skrip tidak dapat dijalankan dalam ISE.
sumber
[System.Console]
tidak dapat diarahkan ke file.Saya curang, tetapi saya percaya ini adalah satu-satunya jawaban yang memenuhi setiap persyaratan. Yaitu, ini menghindari CRLF tertinggal, menyediakan tempat bagi operasi lain untuk menyelesaikan sementara, dan mengarahkan kembali ke stdout seperlunya.
sumber
sumber
o / p yang diinginkan: Mengaktifkan fitur XYZ ...... Selesai
Anda dapat menggunakan perintah di bawah ini
$ a = "Mengaktifkan fitur XYZ"
Tulis-output "$ a ...... Selesai"
Anda harus menambahkan variabel dan pernyataan di dalam tanda kutip. semoga ini membantu :)
Terima kasih Techiegal
sumber
Sudah ada begitu banyak jawaban di sini, tidak ada yang akan gulir ke sini. Bagaimanapun juga ada solusi untuk menulis teks tanpa baris baru di akhir, dengan yang berikut:
Output file dengan penyandian:
Output konsol:
sumber
Anda benar-benar dapat melakukan ini. Write-Output memiliki bendera yang disebut " NoEnumerate " yang pada dasarnya adalah hal yang sama.
sumber