PowerShell–efektywnie(j), część 10

Tak jak wspominałem – mój cykl nie byłby kompletny bez zamknięcia klamrom tego, co napisałem do tej pory. Ponieważ przestrzeń dostępna dla nas w ramach PowerShella jest bardzo szeroka – od pisania na kolanie, po tworzenie niemal pełnych aplikacji, dobrze jest znać narzędzia, które pozwalają “skakać” pomiędzy tymi skrajnymi punktami. W dzisiejszym poście zamierzam właśnie o takich elementach wspomnieć.

Zacznę od tego, co jest mojemu sercu najbliższe. Na ogół pracuję interaktywnie w PowerShellu, a skrypty naturalnie ewoluują od prostych, sklejanych komend do składowych modułu, ze wszystkim co się z tym wiąże. Początek jest zwykle ten sam: problem, który trzeba rozwiązać. Zaczynamy “sklejać” komendy, które potencjalnie mogą nam dać ostateczny rezultat. Czasem, po drodze, zapiszemy coś w zmiennej, by móc generowane obiekty “poobracać” i przyjrzeć się im z każdej strony. W końcu uzyskujemy to, do czego zmierzaliśmy i…? Właśnie, to doskonały moment, by zebrać rozwiązanie w jeden blok i stworzyć szkic naszego przyszłego skryptu, funkcji…

Metoda jest prosta, wystarczy zatrudnić Get-History (alias ‘h’) i aplikację systemową clip.exe. Oczywiście, by dało się coś w ten sposób osiągnąć, koniecznie trzeba zadbać o odpowiednią długość naszej historii. Zacznijmy więc może od zmiany, dzięki której nic nam nie “umknie”.

Historia

Wiele z elementów konfiguracji PowerShell przechowuje w zmiennych, zbiorczo nazywanych “preference variables” (help about_preference_variables). Nie musimy sobie naturalnie zaśmiecać pamięci nazwami tych zmiennych, proste polecenie: Get-Variable *history* dużo szybciej doprowadzi nas do odpowiednich rezultatów. $MaximumHistoryCount – to nasz cel. Oczywiście, zmienimy ją raczej w naszym profilu, nie chcemy przecież za każdym razem jej szukać. Jaką nadać jej wartość…? Cóż, ja w tym wypadku “idę na całość”. Winking smile

Valid values: 1 – 32768 (Int32)

U mnie jest to 32767, wbrew temu co widzimy w dokumentacji typ to Int16 i właśnie jego MaxValue nas ogranicza:

[Int16]::MaxValue
32767

Gdy jesteśmy już pewni, że nasza historia będzie przez PowerShella skrzętnie gromadzona – możemy przejść do drugiego etapu, zebrania historii i zapisania jej w “szkicu” przyszłego skryptu. Scenariusz jest prosty: oto wpisaliśmy kilka(naście) komend, by na końcu uzyskać wynik zgodny z tym, czego poszukiwaliśmy. Teraz chcielibyśmy wykluczyć konieczność powtarzania tych samych kroków następnym razem, idealny kandydat na skrypt. Jak go stworzyć? Wystarczy z zapisanych w historii komend wydobyć właściwość zawierającą sam kod (CommandLine) i przekierować do pliku:

Get-History | ForEach-Object { $_.CommandLine } |             
    Out-File -FilePath Tymczasowy.ps1

Oczywiście, na ogół taki spis komend wymagać będzie poprawek, ale przynajmniej nie będziemy musieli sami przepisywać sekwencji komend, która doprowadziła nas do pożądanego rezultatu.

Moduł dla leniuchów

Pora na spojrzenie w drugą stronę. Oto stworzyliśmy twór “wyższego poziomu” i chcielibyśmy móc swobodnie korzystać z niego w pracy interaktywnej. Jak to osiągnąć? Cóż, z całą pewnością ważne jest, by nasze komendy łatwo było odnaleźć i by ich nazwy były zgodne z zasadami (<zaaprobowany czasownik>-<rzeczownik w liczbie pojedynczej>).

By jednak praca dla osób korzystających z naszego modułu często (nawet jeśli owym ktosiem będziemy tylko my sami) warto czasem rozważyć utworzenie aliasów do często używanych komend oraz ich parametrów, jeśli taki skrót może ułatwić używanie naszej komendy. Warto tu zwrócić na pewne prawidłowości, pewną powtarzalność. Aliasy poleceń, choć nie zostało to nigdzie wprost napisane, są ściśle powiązane z czasownikiem (get –> g, import –> im). Rzeczownik ma tylko jeden wymóg – musi być stały. Czyli jeśli skrócimy Foo do F w Get-Foo, to tak samo powinnyśmy postąpić przy skracaniu Set-Foo.

Aliasy parametrów mają sens zwykle wtedy, gdy parametr jest długi i dzieli on początek z innymi parametrami. Osobiście, staram się aliasy dodawać wszędzie tam, gdzie parametr składa się z kilku “słów”: ComputerName, ConfigurationPath). Zasada tworzenia takich aliasów jest raczej prosta – bierzemy pierwszą litery obu “słów”, sklejamy, et voila – mamy alias.

Ostatni element, który pracą w konsoli ułatwia, to wsparcie dla “rurki”. Jeśli mogę zrobić:

Get-Foo | Set-Foo -PassThru | Format-Table foo, bar

… to znaczy że autor modułu postarał się, by moje wrażenia z modułu użytkowania były możliwie najlepsze. Tutaj oczywiście potrzebny jest zdrowy rozsądek – nie każda komenda nadaje się do tego, by na wejściu otrzymywać obiekty tworzone przez inne polecenie. Przy Set-, Remove-, Update- na pewno bym się jednak nie wahał.

Podsumowanie

To już naprawdę koniec tego cyklu. Puszczam oczko Teraz postaram się zainwestować nieco więcej czasu w filmy. Drugi jest już nagrany, muszę jeszcze go przeedytować. Niestety, fakt że pojawiły się nowe “zabawki” nie ułatwia sprawy. Puszczam oczko

~ - autor: Bartek Bielawski w dniu Czerwiec 3, 2012.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Zdjęcie na Google+

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s

 
%d blogerów lubi to: