Script PowerShell, menampilkan perintah yang dijalankan

37

Saya bermain-main dengan skrip PowerShell dan mereka bekerja dengan baik. Namun, saya bertanya-tanya apakah ada cara untuk juga menunjukkan semua perintah yang dijalankan, sama seperti jika Anda mengetiknya sendiri secara manual. Ini akan mirip dengan "echo on" dalam file batch. Saya melihat argumen baris perintah PowerShell, cmdlet, tapi saya tidak menemukan sesuatu yang jelas. Terima kasih!

Nelson Rothermel
sumber

Jawaban:

45

Perintah berikut akan menampilkan setiap baris skrip ke Write-Debug-

Set-PSDebug -Trace 1

Dari man Set-PSDebug

Ketika parameter Lacak diatur ke 1, setiap baris skrip dilacak saat dijalankan. Ketika parameter diatur ke 2, penugasan variabel, panggilan fungsi, dan panggilan skrip juga dilacak. Jika parameter Langkah ditentukan, Anda diminta sebelum setiap baris skrip dieksekusi.

Spongeboy
sumber
Jika Anda menambahkan ini ke skrip yang menggunakan Param, pastikan untuk menempatkan baris ini di bawah blok param-defining atau dapat menyebabkan kegagalan.
kayleeFrye_onDeck
4

Di mana saya menggunakan echo onCMD, sekarang saya gunakan Write-Verbosedan Set-PSDebug -Stepsebagai gantinya. Mereka tidak sama, tetapi mereka lebih kuat jika dipegang dengan terampil.

Jay Bazuzi
sumber
2

Jelek:

PS > get-content foo.ps1|foreach-object{$_;invoke-expression "$_"}
$procs=get-process powershell
foreach($proc in $procs){$proc.processname}
powershell
PS > get-content foo.ps1
$procs=get-process powershell
foreach($proc in $procs){$proc.processname}
PS >

Masalah dengan hal di atas adalah jika Anda memiliki perintah multi-line seperti ini:

foreach($proc in $procs){
  $proc.processname
}

Di atas akan gagal dengan contoh saya di atas jika itu ditempatkan di foo.ps1 dengan struktur itu ...

Marco Shaw
sumber
Ya, saya terus mencari setengah solusi seperti ini. Saya benar-benar berpikir tidak ada "peluru perak" untuk apa yang saya inginkan. Terima kasih telah berkreasi dengan solusi ini. Saya punya beberapa pilihan sekarang dan harus memutuskan ke mana harus pergi dari sini.
Nelson Rothermel
2
help about_History 

Akan memberi tahu Anda tentang semua perintah dan

Get-History [options]  

akan mengembalikan daftar lengkap untuk Anda manipulasi \ tampilan dll.

Helvick
sumber
2
Saya menemukan "set-psdebug -trace 1" yang akan menampilkan perintah, tetapi banyak "noise" tambahan yang tidak saya inginkan. get-history tidak menampilkan apa pun dalam skrip. Jika ya saya bisa menempelkannya di akhir skrip, tetapi kemudian perintah tidak akan sejalan (sebelum output perintah) dan setiap pengecualian akan melewatkannya (kecuali saya tentu saja menangkapnya). Masih bagus untuk diingat ... Ada ide lain?
Nelson Rothermel
Ah - maksud Anda bahwa Anda ingin menangkap input dan output, atau setidaknya Anda ingin mengulang perintah input segera diikuti oleh output yang sesuai? Salah satu cara untuk melakukannya adalah dengan mendorong hasil ke dalam array dan kemudian loop melalui hasil get-history menghasilkan perintah diikuti oleh outputnya.
Helvick
mulai-transkrip mungkin juga melakukan apa yang Anda cari tetapi itu akan terbatas pada bagian teks konsol dari tindakan saja.
Helvick
Anda mendapatkannya - cara yang sama file batch bekerja. Kami memiliki banyak file batch sekarang dan saya melihat kelayakan untuk mengganti mereka dengan skrip PowerShell. Kami memiliki perangkat lunak untuk penjadwalan, mempertahankan riwayat keluaran, dll. Tanpa perintah input yang diulang, lebih sulit untuk di-debug. Saya menduga mendorong hasil mengharuskan Anda melakukan itu pada setiap perintah, pastikan Anda menangkap pengecualian, dll. Sehingga Anda tidak ketinggalan apa pun. Pilihan lain, tetapi tidak cukup apa yang saya cari. Kita mungkin hanya harus memilih satu opsi dan menjalankannya.
Nelson Rothermel
Saya mencoba memulai transkrip, tetapi hanya mencatat bahwa ia memulai / berhenti, tetapi tidak ada di antaranya. Saya membaca di suatu tempat itu dimaksudkan untuk perintah interaktif.
Nelson Rothermel