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.

Łukasz Skalikow

Obecnie Manager IT. Przez lata byłem Inżynierem systemów. Jestem entuzjastą i specem od vSphere, Windows serwer, GPO. Od zawsze byłem zwolennikiem wiersza poleceń i automatyzacji. Obecnie, ze względu na pracę, rodzinę i wyjazdy służbowe, dużo mniej udzielam się na blogu, ale mam nadzieję, że pośród kilkuset porad opublikowanych na spece.it, wiele osób znajdzie dla siebie coś przydatnego :)

Przeczytaj także...

9 komentarzy

  1. Greg pisze:

    Ł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 pisze:

      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 pisze:

      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 pisze:

      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.

  2. Mirek pisze:

    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 pisze:

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

    • Mirek pisze:

      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…;)

  3. Rafał Witowski pisze:

    czy dla plików csv można dać parametr separator średnik zamiast przecinek, bo wtedy Excel daje do rożnych kolumn.

Dodaj komentarz