Một số lưu ý chung.
$obj | Select-Object
⊆ $obj | Select-Object -Property *
Cái sau sẽ hiển thị tất cả các thuộc tính không phải nội tại, không do trình biên dịch tạo ra. Trước đây dường như không (luôn luôn) hiển thị tất cả các loại Thuộc tính (trong các thử nghiệm của tôi, nó dường như hiển thị CodeProperty
MemberType
mặc dù nhất quán - không đảm bảo ở đây).
Một số điểm chuyển đổi cần lưu ý đối với Get-Member
Get-Member
không không có được các thành viên tĩnh theo mặc định. Bạn cũng không thể (trực tiếp) làm cho chúng cùng với các thành viên không tĩnh. Đó là, việc sử dụng switch chỉ trả về các thành viên tĩnh:
PS Y:\Power> $obj | Get-Member -Static
TypeName: System.IsFire.TurnUpProtocol
Name MemberType Definition
---- ---------- ----------
Equals Method static bool Equals(System.Object objA, System.Object objB)
...
Sử dụng -Force
.
Các Get-Member
lệnh sử dụng Force tham số để thêm các thành viên nội tại và các thành viên biên dịch tạo ra các đối tượng để hiển thị. Get-Member
nhận được các thành viên này, nhưng nó ẩn chúng theo mặc định.
PS Y:\Power> $obj | Get-Member -Static
TypeName: System.IsFire.TurnUpProtocol
Name MemberType Definition
---- ---------- ----------
...
pstypenames CodeProperty System.Collections.ObjectModel.Collection...
psadapted MemberSet psadapted {AccessRightType, AccessRuleType,...
...
Sử dụng ConvertTo-Json
cho độ sâu và "tuần tự hóa" có thể đọc được
Tôi không cần thiết, khuyên bạn nên lưu các đối tượng bằng JSON (sử dụng Export-Clixml
thay thế). Tuy nhiên, bạn có thể nhận được nhiều hơn hoặc ít hơn đầu ra có thể đọc được ConvertTo-Json
, điều này cũng cho phép bạn chỉ định độ sâu.
Lưu ý rằng không chỉ định Depth
ngụ ý-Depth 2
PS Y:\Power> ConvertTo-Json $obj -Depth 1
{
"AllowSystemOverload": true,
"AllowLifeToGetInTheWay": false,
"CantAnyMore": true,
"LastResortOnly": true,
...
Và nếu bạn không định đọc nó, bạn có thể đọc -Compress
nó (tức là loại bỏ khoảng trắng)
PS Y:\Power> ConvertTo-Json $obj -Depth 420 -Compress
Sử dụng -InputObject
nếu bạn có thể (và sẵn lòng)
99,9% thời gian khi sử dụng PowerShell: hiệu suất sẽ không thành vấn đề hoặc bạn không quan tâm đến hiệu suất. Tuy nhiên , cần lưu ý rằng tránh sử dụng đường ống khi bạn không cần thiết có thể tiết kiệm một số chi phí và tăng thêm một số tốc độ (đường ống, nói chung, không phải là siêu hiệu quả).
Đó là, nếu tất cả những gì bạn có là một $obj
tiện ích để in (và đôi khi không quá lười biếng như tôi để gõ ra -InputObject
):
# select is aliased (hardcoded) to Select-Object
PS Y:\Power> select -Property * -InputObject $obj
# gm is aliased (hardcoded) to Get-Member
PS Y:\Power> gm -Force -InputObject $obj
Lưu ý Get-Member -InputObject
:
Nếu $ obj là một bộ sưu tập (ví dụ System.Object[]
), bạn sẽ nhận được thông tin về chính đối tượng bộ sưu tập:
PS Y:\Power> gm -InputObject $obj,$obj2
TypeName: System.Object[]
Name MemberType Definition
---- ---------- ----------
Count AliasProperty Count = Length
...
Nếu bạn muốn Get-Member
cho mỗi TypeName
trong bộ sưu tập (NB cho mỗi TypeName
, không cho từng đối tượng - một bộ sưu tập của N đối tượng với tất cả cùng TypeName
sẽ chỉ in 1 bảng cho rằng TypeName
, không tồn bảng cho từng đối tượng) ...... chỉ cần gắn trực tiếp vào đường ống.
-Force
tham số để làm cho nó làm việc, ví dụWrite-Host ($obj | Format-List -Force | Out-String)