Saat bekerja di konsol interaktif jika saya mendefinisikan objek baru dan menetapkan beberapa nilai properti padanya seperti ini:
$obj = New-Object System.String
$obj | Add-Member NoteProperty SomeProperty "Test"
Kemudian ketika saya mengetik nama variabel saya ke dalam jendela interaktif Powershell memberi saya ringkasan properti dan nilai objek:
PS C:\demo> $obj
SomeProperty
------------
Test
Saya pada dasarnya ingin melakukan ini tetapi dari dalam fungsi dalam skrip. Fungsi ini membuat objek dan menetapkan beberapa nilai properti dan saya ingin mencetak ringkasan nilai objek ke jendela Powershell sebelum kembali. Saya mencoba menggunakan Write-Host dalam fungsi:
Write-Host $obj
Tapi ini hanya menampilkan tipe objek bukan ringkasan:
System.Object
Bagaimana saya bisa membuat fungsi saya menampilkan ringkasan nilai properti objek ke jendela Powershell?
powershell
John
sumber
sumber
-Force
parameter agar berfungsi, misalnyaWrite-Host ($obj | Format-List -Force | Out-String)
...
. Saya punya cinta benci dengan POSH$objs = @();
dan$objs = $objs + $obj;
saya dapat menggunakanConvertTo-Html
: $ cols = $ objs | ConvertTo-Html -Fragment -Nama Properti, Jenis Data, Default, Identitas, InPrimaryKey, IsForeignKey, Deskripsi;Solusi saya untuk masalah ini adalah dengan menggunakan blok sub-ekspresi $ () .
Memberikan:
sumber
Untuk mencetak properti dan nilai objek di Powershell. Contoh di bawah ini bekerja dengan baik untuk saya.
$ pool = Dapatkan-Item "IIS: \ AppPools.NET v4.5"
$ pool | Dapatkan-Anggota
$ pool | Select-Object -Property * # Anda dapat menghilangkan -Property
sumber
$x | select *
, bagus untuk interaktif.Kiat # 1
Kiat # 12
-Don Jones: Master PowerShell
Idealnya skrip Anda akan membuat objek Anda (
$obj = New-Object -TypeName psobject -Property @{'SomeProperty'='Test'}
) lalu lakukan aWrite-Output $objects
. Anda akan menyalurkan output keFormat-Table
.Mereka harus benar-benar memanggil PowerShell PowerObjectandPipingShell.
sumber
Never use Write-Host.
pernyataan. Anda tidak dapat menggunakan fungsi Write-Output di dalam yang mengembalikan data, karena akan "mencemari" fungsi ini. Contoh sederhana. Tebak fungsi ReturnText apa yang akan dihasilkan? Inilah mengapa saya selalu menggunakan fungsi dalam host-Write. function ReturnText () {Write-Output "Some random message" return "What I want to return"}Beberapa catatan umum.
$obj | Select-Object
⊆$obj | Select-Object -Property *
Yang terakhir akan menampilkan semua properti non-intrinsik, non-kompilator. Mantan tidak tidak muncul untuk (selalu) menunjukkan semua jenis properti (di tes saya, itu tidak muncul untuk menunjukkan
CodeProperty
MemberType
secara konsisten meskipun - tidak ada jaminan di sini).Beberapa sakelar yang harus diperhatikan untuk Get-Member
Get-Member
tidak tidak mendapatkan anggota statis secara default. Anda juga tidak bisa (secara langsung) membawanya bersama dengan anggota non-statis. Artinya, menggunakan sakelar menyebabkan hanya anggota statis yang dikembalikan:Gunakan
-Force
.Gunakan
ConvertTo-Json
untuk "serialisasi" yang mendalam dan dapat dibacaSaya tidak perlu merekomendasikan menyimpan objek menggunakan JSON (gunakan
Export-Clixml
sebagai gantinya). Namun, Anda bisa mendapatkan lebih banyak atau lebih sedikit keluaran yang dapat dibacaConvertTo-Json
, yang juga memungkinkan Anda menentukan kedalaman.Perhatikan bahwa tidak menentukan
Depth
berarti-Depth 2
Dan jika Anda tidak berencana untuk membacanya, Anda dapat
-Compress
membacanya (yaitu menghapus spasi)Gunakan
-InputObject
jika Anda bisa (dan mau)99,9% dari waktu saat menggunakan PowerShell: entah kinerjanya tidak penting, atau Anda tidak peduli dengan kinerjanya. Namun , perlu dicatat bahwa menghindari pipa saat Anda tidak membutuhkannya dapat menghemat overhead dan menambah kecepatan (pemipaan, secara umum, tidak super efisien).
Artinya, jika yang Anda miliki hanyalah satu yang
$obj
berguna untuk dicetak (dan terkadang tidak terlalu malas seperti saya untuk mengetik-InputObject
):Peringatan untuk
Get-Member -InputObject
: Jika $ obj adalah sebuah koleksi (mis.System.Object[]
), Anda akhirnya mendapatkan informasi tentang objek koleksi itu sendiri:Jika Anda ingin
Get-Member
untuk setiapTypeName
dalam koleksi (NB untuk masing-masingTypeName
, bukan untuk setiap objek - kumpulan N objek dengan semua yang samaTypeName
hanya akan mencetak 1 tabel untuk ituTypeName
, bukan N tabel untuk setiap objek) ...... cukup tetap dengan menyalurkannya secara langsung.sumber
Di bawah ini bekerja sangat baik untuk saya. Saya menambal semua jawaban di atas ditambah membaca tentang menampilkan properti objek di tautan berikut dan menghasilkan bacaan singkat di bawah ini tentang mencetak objek
tambahkan teks berikut ke file bernama print_object.ps1:
buka command prompt PowerShell, buka direktori tempat file itu ada dan ketik yang berikut ini:
Cukup gantikan 'System.DateTime' dengan objek apa pun yang ingin Anda cetak. Jika objeknya null, tidak ada yang akan dicetak.
sumber
sumber