Podczas pracy w konsoli interaktywnej, jeśli zdefiniuję nowy obiekt i przypiszę mu kilka wartości właściwości w następujący sposób:
$obj = New-Object System.String
$obj | Add-Member NoteProperty SomeProperty "Test"
Następnie, kiedy wpiszę nazwę mojej zmiennej w interaktywnym oknie, program PowerShell wyświetli podsumowanie właściwości i wartości obiektu:
PS C:\demo> $obj
SomeProperty
------------
Test
Zasadniczo chcę to zrobić, ale z poziomu funkcji w skrypcie. Funkcja tworzy obiekt i ustawia niektóre wartości właściwości i chcę, aby przed zwróceniem wydrukowała podsumowanie wartości obiektu w oknie programu PowerShell. Próbowałem użyć Write-Host w funkcji:
Write-Host $obj
Ale to tylko wyświetla typ obiektu, a nie podsumowanie:
System.Object
W jaki sposób mogę sprawić, aby funkcja wyprowadzała podsumowanie wartości właściwości obiektu w oknie programu PowerShell?
powershell
Jan
źródło
źródło
-Force
parametr, aby działał, np.Write-Host ($obj | Format-List -Force | Out-String)
...
. Mam miłość do nienawiści z POSH$objs = @();
i$objs = $objs + $obj;
mogę użyćConvertTo-Html
: $ cols = $ objs | ConvertTo-Html -Fragment -Property Name, DataType, Default, Identity, InPrimaryKey, IsForeignKey, Description;Moim rozwiązaniem tego problemu było użycie bloku wyrażenia podrzędnego $ () .
Daje:
źródło
Aby wydrukować właściwości i wartości obiektu w programie PowerShell. Poniższe przykłady sprawdzają się u mnie dobrze.
$ pool = Get-Item "IIS: \ AppPools.NET v4.5"
$ pool | Get-Member
$ pool | Select-Object -Property * # Możesz pominąć -Property
źródło
$x | select *
, świetny do interaktywności.Wskazówka nr 1
Porada nr 12
-Don Jones: Mistrz PowerShell
Idealnie byłoby, gdyby twój skrypt utworzył twoje obiekty (
$obj = New-Object -TypeName psobject -Property @{'SomeProperty'='Test'}
), a następnie po prostu wykonałby plikWrite-Output $objects
. Możesz potokować wyjście doFormat-Table
.Powinni naprawdę wywołać PowerShell PowerObjectandPipingShell.
źródło
Never use Write-Host.
stwierdzenia. Nie można używać funkcji Write-Output wewnątrz funkcji zwracających dane, ponieważ spowoduje to „zanieczyszczenie” tej funkcji. Prosty przykład. Zgadnij, jaka funkcja ReturnText wyświetli? Dlatego zawsze używam wewnętrznych funkcji Write-host. function ReturnText () {Write-Output "Some random message" return "What I want to return"}Kilka uwag ogólnych.
$obj | Select-Object
⊆$obj | Select-Object -Property *
Ta ostatnia pokaże wszystkie nie wewnętrzne, nie wygenerowane przez kompilator właściwości. Pierwsza z nich nie wydaje się (zawsze) pokazywać wszystkich typów właściwości (w moich testach wydaje się, że pokazuje to
CodeProperty
MemberType
konsekwentnie - tutaj nie ma gwarancji).Niektóre przełączniki, o których należy pamiętać w przypadku Get-Member
Get-Member
ma nie dostać elementy statyczne domyślnie. Nie możesz również (bezpośrednio) uzyskać ich razem z niestatycznymi członkami. Oznacza to, że użycie przełącznika powoduje zwrócenie tylko statycznych elementów członkowskich:Użyj
-Force
.Używaj
ConvertTo-Json
do dokładnej i czytelnej „serializacji”Ja nie niezbędne polecić zapisywanie obiektów za pomocą JSON (stosowanie
Export-Clixml
zamiast). Można jednak uzyskać mniej lub bardziej czytelne dane wyjścioweConvertTo-Json
, co pozwala również określić głębokość.Zauważ, że brak określenia
Depth
oznacza-Depth 2
A jeśli nie planujesz tego czytać, możesz to
-Compress
zrobić (tj. Usuń spacje)Użyj,
-InputObject
jeśli możesz (i chcesz)99,9% czasu podczas korzystania z PowerShell: albo wydajność nie ma znaczenia, albo nie przejmujesz się wydajnością. Jednakże , należy zauważyć, że unikanie rurę, kiedy nie potrzeba może zaoszczędzić trochę napowietrznych i dodać trochę prędkości (rurociągi, ogólnie rzecz biorąc, nie jest super-wydajny).
Oznacza to, że jeśli masz wszystko, co masz, to jedna
$obj
poręczna do drukowania (i nie jesteś tak leniwy jak ja, żeby czasami pisać-InputObject
):Uwaga na
Get-Member -InputObject
: jeśli $ obj jest kolekcją (np.System.Object[]
), W końcu uzyskujesz informacje o samym obiekcie kolekcji:Jeśli chcesz
Get-Member
dla każdegoTypeName
w kolekcji (uwaga dla każdegoTypeName
, nie dla każdego obiektu - zbiór N obiektów z takimi samymiTypeName
wypisuje tylko 1 tabelęTypeName
, a nie N tabel dla każdego obiektu) ...... po prostu trzymaj się go bezpośrednio.źródło
Poniższe działały naprawdę dobrze dla mnie. Poprawiłem wszystkie powyższe odpowiedzi oraz przeczytałem o wyświetlaniu właściwości obiektów w poniższym linku i wymyśliłem poniżej krótką lekturę o drukowaniu obiektów
dodaj następujący tekst do pliku o nazwie print_object.ps1:
otwórz wiersz polecenia powershell, przejdź do katalogu, w którym istnieje ten plik i wpisz:
Po prostu zastąp „System.DateTime” dowolnym obiektem, który chcesz wydrukować. Jeśli obiekt jest pusty, nic nie zostanie wydrukowane.
źródło
źródło