Powershell: eksportowanie wyniku do pliku CSV lub HTM oraz opcje formatowania


 

powershell_icon_150Niezwykle istotną i często używaną funkcją skryptów jest zachowywanie wyników w pliku. Czasem robimy to, by mieć loga z jakichś zdarzeń, innym razem przy przekazać komuś zestawienie pewnych informacji. Każdy Admin jednak wie, że przeglądanie dużej ilości danych w konsoli jest po prostu niewygodne i trzeba je zapisać w bardziej czytelnej formie (dla przypomnienia, podobny artykuł o CMD). Powershell pozwala zapisywać wyniki w plikach CSV lub HTM oraz dokładnie sprecyzować, które kolumny mają się tam znaleźć. Przedstawię to na przykładzie opisywanego kiedyś polecenia „get-process”, które wyświetla podstawowe informacje o aktywnych procesach.

powershell get-process

Okazuje się, że większość cmdletów zawiera znacznie więcej informacji, niż to, co wyświetlają w swojej podstawowej formie.

To polecenie zachowa wynik w pliku csv:

Jakiś cmdlet | export-csv ścieżka do pliku .csv

Na przykład:

get-process | export-csv c:\procesy.csv

Wpisując to polecenie, nic nie zobaczymy na ekranie, ale zaglądając do wyeksportowanego pliku możemy się bardzo miło zdziwić:
Plik zawiera całe mnóstwo kolumn (oczywiście zależnych od głównego cmdlet’u jaki użyliśmy – tu znajdziecie wszystko o procesach) – podaję same tytuły kolumn:

„Name”,”Handles”,”VM”,”WS”,”PM”,”NPM”,”Path”,”Company”,”CPU”, „FileVersion”,”ProductVersion”,”Description”, „Product”,”BasePriority”,”ExitCode”,”HasExited”,”ExitTime”, „Handle”,”HandleCount”,”Id”,”MachineName”,”MainWindowHandle”, „MainWindowTitle”,”MainModule”,”MaxWorkingSet”, „MinWorkingSet”,”Modules”,”NonpagedSystemMemorySize”, „NonpagedSystemMemorySize64″,”PagedMemorySize”, „PagedMemorySize64″,”PagedSystemMemorySize”, „PagedSystemMemorySize64″,”PeakPagedMemorySize”, „PeakPagedMemorySize64″,”PeakWorkingSet”, „PeakWorkingSet64″,”PeakVirtualMemorySize”, „PeakVirtualMemorySize64″,”PriorityBoostEnabled”, „PriorityClass”,”PrivateMemorySize”,”PrivateMemorySize64″, „PrivilegedProcessorTime”,”ProcessName”, „ProcessorAffinity”,”Responding”,”SessionId”,”StartInfo”,”StartTime”, „SynchronizingObject”,”Threads”,”TotalProcessorTime”, „UserProcessorTime”,”VirtualMemorySize”, „VirtualMemorySize64″,”EnableRaisingEvents”, „StandardInput”,”StandardOutput”,”StandardError”, „WorkingSet”,”WorkingSet64″,”Site”,”Container”

..a tak sformatujecie wynik do formatu HTM i zapiszecie go:

get-process | ConvertTo-HTML > C:\procesy.htm

W tym wypadku akurat ścieżka jest opcjonalna – nie podając jej zobaczymy wynik razem z tagami html (co oczywiście będzie prawie nieczytelne w konsoli PS)

I teraz najzabawniejsza część tego artykułu: Czy musimy produkować pliki z tak wieloma kolumnami?
Oczywiście, że nie. Możemy sprecyzować, które kolumny będą widoczne w pliku wynikowym: – na przykład tylko nazwa i wątki (handles):

get-process | ConvertTo-HTML -Property Name,Handles

Oto fragment pliku wynikowego:

powershell-htm

Czujecie potęgę Powershella i głód dalszych porad? Na pewno takowe będą – zaglądajcie na nasz Blog :) Jeśli macie coś ciekawego do dodania w tym temacie – piszcie śmiało.


Podobne Tematy:

  • Greg

    Łukasz … czemu przykłady które zamieszczasz są typowymi przykładami książkowymi jakich pełno na innych stronach ? wszędzie tylko Get-Process lub Get-Service

    • Łukasz Skalikow

      Z kilku powodów: ciągle trafiam na osoby, którym trzeba te podstawy przekazać (koniecznie po polsku), a polskich Blogów z powershellem wcale nie ma tak dużo. Poza tym, pisząc o bardziej zaawansowanych rzeczach, nieraz trzeba podlinkować pewne podstawy – na przykład właśnie jak się eksportuje dane, by w każdym artykule tego samego nie tłumaczyć :)

      Jutrzejszy artykuł zawiera jeszcze prostsze podstawy, więc od razu ostrzegam :)

      Jaki bardziej zaawansowany temat by Ciebie interesował?

      • Greg

        Operacje na danych tekstowych: zamiana ciągów znaków, wyszukiwanie ciągów ( cos jak grep np.: [….|where {$_ -match „*.aspx”}……]); operacje na tablicach… tez z danymi textowymi,operacje na kontach użytkowników AD … znowu dane txt…, itp.

        Ewentualnie coś o obsłudze klastrów, i nowego rozwiązania terminali w 2012 RD Gateway+ RC ConnectionBroker (HA); RD SessionHosts ….

        • Łukasz Skalikow

          Greg, Na pewno ucieszy Cię fakt, że artykuł ciągach znaków (z bardzo interesującą fotką) jest już w drafcie u Piotra. Stay Tuned.

  • Mirek

    A Ja mam mały problem, ponieważ wpisuje taką komendę:
    PS C:Windowssystem32> Get-ChildItem D:jakis_folder, format-table BaseName | ConvertTo-HTML > D:jakis_folderrozne_bazypsjakis_plik.htm
    i nie działa mi ta ścieżka, generalnie BaseName to nazwa kolumny którą chcę żeby tylko ona się wyświetliła, a to: D:jakis_folderrozne_bazypsjakis_plik.htm to jest ścieżka gdzie chcę aby wynik się zapisał….

    • Mirek

      Ok, udało się…trzeba było Property BaseName dopisać na końcu całej komendy…

      • Mirek

        Teraz kombinuje jak zrobić sobie plik bat który będzie to robił ale z poziomu mojego pulpitu…sorry że tak pisze ale to mi pomaga…;)