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

•3 czerwca, 2012 • Dodaj komentarz

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

Zmiany, zmiany, zmiany… ;)

•5 Maj, 2012 • 1 komentarz

Wreszcie zakończył się kwiecień – miesiąc niezmiernie pracowity w moim wypadku. Jak wiecie w miesiącu tym toczyły się tegoroczne Scripting Games, w których miałem przyjemność uczestniczyć jako sędzia. A ponieważ staram się swoją robotę wykonywać jak najlepiej, do sędziowania przystąpiłem z pełną parą. Pod koniec nieco zabrakło mi energii, ale i tak przejrzałem i oceniłem ponad 1000 skryptów, większość (szczególnie rozbudowanych) testując. Starałem się też komentować wszystkie skrypty, które oceniłem poniżej oceny najwyższej, a i te “piątkowe” często opatrywałem stosownym komentarzem. Wszak czasem nawet jak jest bardzo dobrze, to można coś ulepszyć. Smile

Dodatkowo na bieżąco pisałem komentarze “ogólne” w postaci postów na moim angielskim blogu (by ludzie spoza PL również mogli zrozumieć OCB. Jak ktoś jest ciekawy, to najłatwiej je znaleźć w odpowiedniej kategorii.

Druga przyczyna sporego obciążenia to sesje: o sesji na WGUiSW pisałem już, dodatkowo dzięki inicjatywie i wsparciu Grześka Gałęzowskiego miałem przyjemność poopowiadać o ShowUI studentom (głównie) w Lublinie, w czasie odbywających się tam Lubelskich Dni Informatyki. Starałem się prezentację powiększyć, by tym razem nie skończyć przed czasem. Niestety – mimo moich zabiegów znów wyrobiłem się w 2/3 czasu, w sumie około 40 minut. Trudno jednoznacznie powiedzieć, czy się sesja podobała. Sam wiem, że nie obyło się bez błędów. Cóż, człowiek uczy się całe życie… Winking smile

Trzecia przyczyna wiązała się bezpośrednio z pracą, a raczej zaległościami, które “zawdzięczałem” chorobom moich pociech. Co prawda dało mi to czas na intensywne sędziowanie (z czego skrzętnie skorzystałem), ale jednak pewnych rzeczy zdalnie w pracy zrobić nie mogę.

Pora coś zmienić…

Jeśli ktoś zaglądał tu regularnie, to pewnie zauważył, że strona się ciapkę zmieniła. Cóż, uznałem, że pora nieco zainwestować w mojego bloga. Nie dlatego, że spodziewam się w najbliższym czasie jakichś zysków. Raczej po to, by wreszcie uczynić go czytelnym (nie napiszę ładniejszym, bo o gustach się nie dyskutuje Winking smile ). Dodatkowo planuję projekt, który wymaga nieco przestrzeni na serwerze i możliwości zamieszania na blogu filmików. Planuję też zarejestrować jakąś domenę, by mój blog miał nieco bardziej… spersonalizowaną “tożsamość”. Skąd jednak filmiki? Od dłuższego czasu noszę się z pomysłem nagrywania króciutkich klipów (po polsku) dotyczących różnych aspektów pracy z Windows PowerShell. Teraz, dzięki darmowej licencji NFR na Camtasia’e i SnagIta, które uzyskałem od TechSmith, mogę plany zacząć wcielać w życie. Jeśli ktoś z Was jest zainteresowany wersją testową pierwszej części serii dotyczącej wyrażeń regularnych w PowerShellu – poproszę o kontakt, podeślę Wam URLkę i hasło. Publicznie udostępnię je dopiero jak będzie ich więcej/ będę w pełni zadowolony z jakości. Wiadomo, nawet najlepsze narzędzia (a Camtasia naprawdę jest wyśmienita) nie zrobią za człowieka wszystkiego. Dykcji na pewno poprawić nie umieją. Winking smile 

Podsumowanie

Dzisiejszy post jest raczej z tych krótkich i służyć ma temu, by dać znać, że nadal “dycham”. Winking smile W najbliższym czasie pewnie skupię się nad wyżej wspomnianą serią filmów. Jestem też Wam i sobie dłużny jeden post w serii dotyczącej efektywnego PowerShella, o którym przypomniałem sobie przeglądając dziś wcześniejsze wpisy w trakcie testowania nowego css-a. Nie napisałem jeszcze o tym jak w prosty sposób przenosić się między trybem interaktywnym i skryptowym. Coś, co może się przydać każdemu, kto z PowerShellem “wojuje” dość regularnie. Smile Lekki przedsmak…:

Get-History

Scripting Games 2012–Odliczanie: 2…

•31 marca, 2012 • Dodaj komentarz

Ten weekend będzie mi się strasznie dłużył… Z dwóch powodów: w poniedziałek o godzinie 9 (o ile się nie “walnąłem” w przeliczeniach) pojawią się pierwsze zadania w Scripting Games. We wtorek o 18 (tu już bez konwertowania czasu, więc z pewnością absolutną niemalże) wystartuje 40-ste spotkanie WGUiSW, na którym będę miał zaszczyt (mam nadzieję, że również przyjemność) poopowiadać o najnowszej odsłonie mojego ulubionego produktu Microsoftu. Może jest w tym coś niezdrowego, ale naprawdę, chciałbym już mieć ten weekend za sobą. Winking smile

Zanim to jednak nastąpi – pora zamknąć mój mini-cykl, dziś:

2 kategorie, by każdy miał coś dla siebie

Wybór kategorii to sprawa mocno indywidualna. Oczywiście, można przesadzić w obie strony, w obu przypadkach może to być źródło niepotrzebnej frustracji. Co więc zrobić, by decyzję podjąć świadomie? Moim zdaniem trzeba ocenić:

  • czy PowerShella znamy dobrze, czy wiemy o nim jedynie to, co “powie” nam o nim google?
  • czy bardziej zależy nam na wyniku, czy nauce?
  • czy potrzebujemy w nauce wyzwań, czy raczej sukcesów?

Każdy z tych punktów w dość oczywisty sposób popychać nas będzie w jedną, lub drugą stronę. W tym poście napisać zamierzam jedynie, dlaczego moim zdaniem warto czasem rozważyć udział w kategorii zaawansowanej, a czasem lepiej jednak skupić się na tej przeznaczonej dla początkujących.

2… Awansujemy

Moja rada: jeśli masz wątpliwości, to raczej powinieneś spróbować swoich sił w kategorii zaawansowanej. Dlaczego? Bo wątpliwości rodzić się będą wtedy, gdy patrząc na zadania z roku ubiegłego będziesz czuł, że w niższej kategorii po prostu nie mógłbyś w żaden sposób zyskać. Uczestników na ogół jest tam więcej, więc szanse zwycięstwa są mniejsze. Jeśli PowerShell to Twoja codzienność, to rozwiązanie znajdziesz bez trudu a skrypt (działający i z wodotryskami) napiszesz na kolanie, nawet bez otwierania PowerShella. Niczego się więc nie nauczysz. Oczywiście, gwarantuje to ukończenie kompletu skryptów, ale czy naprawdę o to chodzi?

Jeśli mam być szczery, to moim zdaniem ta kategoria jest również (w niektórych przypadkach) dobra dla osób, które PowerShella znają tak sobie. Ale tu warunek: odpowiednia osobowość. Jeśli nierealistyczne, wygórowane wymagania działają na Was stymulująco i sprawiają, że wchodzicie w tryb cyborga – to może być to naprawdę solidny “kopniak” dla Waszego rozwoju. Wiem coś o tym, takiego właśnie “kopa” otrzymałem dwa lata temu. I raczej nie mogę narzekać na to, gdzie mnie to doprowadziło. Winking smile

Ostatni element: mimo wszystko prestiż. Rywalizując w tej kategorii będziesz konkurował z (przynajmniej teoretycznie) najlepszymi. Jeśli uzyskasz dobry wynik, to zyskasz pewien szacunek tych, którym nie udało się (z różnych przyczyn) ukończyć wszystkich skryptów. Dodatkowo na ogół grupa jest tu mniej liczna, trudniej więc “zniknąć w tłumie”, niezależnie od uzyskanego wyniku. Myślę, że warto czasem podjąć ryzyko, zwłaszcza jeśli jesteś osobą ambitną. Trudno czerpać satysfakcję z sukcesów, jeśli wynikają one z obniżania sobie poprzeczki.

1… Zaczynamy

Są jednak przypadki, kiedy kategoria dla początkujących ma sens. Jeśli na pisanie skryptów masz mało czasu, albo dopiero zaczynasz swoją przygodę z PowerShellem… By się uczyć i rozwijać, trzeba mieć odpowiednie podstawy. Bez podstaw efekt może być marny. I to zarówno wtedy, gdy brakujące ogniwo to czas, jak i wtedy, gdy braknie wiedzy. Trudno jest nauczyć się czegoś, jeśli zadania wywołują tylko frustrację i prowadzą do niezdrowej dysproporcji pomiędzy rzeczami ważnymi “obiektywnie”, a uczestnictwem w Scripting Games. Trudno jest też odpowiadać na pytania, których nie jesteśmy w stanie zrozumieć.

Druga potencjalna przyczyna to osobowość, która żywi się sukcesami, choćby najmniejszymi. Oczywiście, łatwiej o sukcesy w kategorii niższej. Jeśli więc nasz rozwój jest skuteczny tylko wtedy, gdy w danej dziedzinie odnosimy nieustannie sukcesy, to kategoria dla początkujących może nam ich dostarczać niemal codziennie przez pełne dwa tygodnie.

I wreszcie: jeśli PowerShell kojarzy Wam się raczej z narzuconą przez okoliczności męką (narzuconą przez nowe produkty wymagające jego znajomości, czy też zbliżający się powoli Windows 8), to raczej ta kategoria będzie dla Was korzystniejsza. I tak macie negatywny stosunek, a PowerShell, po przeskoczeniu pewnego poziomu, to jednak przyjemność. Skok na głęboką wodę kategorii zaawansowanej sprawi, że tylko utwierdzicie się w przekonaniu, że PowerShell nie jest dla Was. A to naprawdę świetne narzędzie, wystarczy tylko je oswoić. Udział w nim jako początkujący jest moim zdaniem świetnym sposobem, by właśnie tego dokonać. Pokochać go może nie pokochacie, ale przynajmniej przestanie Was “kąsać”. Winking smile

Podsumowanie

Mam nadzieję, że troszkę pomogłem w podjęciu decyzji zarówno o udziale, jak i o samej kategorii, w której będzie startować. Jeśli macie jeszcze jakieś pytania – piszcie śmiało. Jeśli będę w stanie odpowiedzieć, na pewno to uczynię. I życzę powodzenia. Smile

Scripting Games 2012–Odliczanie: 4…

•29 marca, 2012 • Dodaj komentarz

4 dni… tylko tyle zostało do rozpoczęcia Scripting Games. Już za kilkadziesiąt godzin ludzie z całego świata zaczną próbować swoich sił w zadaniach, które dla nich przygotował Ed Wilson. Poshcode zacznie wypełniać się tegorocznymi skryptami. Dla mnie był to zawsze szczególnie pracowity czas, w tym roku pewnie będzie to praca jeszcze intensywniejsza: czytanie, testowanie, ocenianie, komentowanie cudzych skryptów, jak sądzę, jest bardziej zasobożernym procesem, niż ich pisanie. Liczę jednak, że satysfakcja będzie proporcjonalnie większa. Zanim to jednak nastąpi – czas na przedostatnią odsłonę tego cyklu, który z założenia ma Was zachęcić do udziału Scripting Games. Dziś:

4 miejsca, gdzie znajdziecie pomoc

Pewnie jak co roku – niektóre zadania będą trudniejsze, niektóre – łatwiejsze. Dwa lata temu wszyscy mogliśmy widzieć to, co napisali inni. Od zeszłego roku – takiej możliwości uczestnicy nie mają. Dlatego dziś opiszę gdzie szukać pomocy w sytuacji, gdy jakiś element zadania stanie nam niby ość w gardle. Naturalnie, nikt za nas nie napisze rozwiązania. Ale jeśli gdzieś “utkniemy” to z całą pewnością możemy liczyć na pomoc innych. A gdzie tej pomocy szukać…?

4… Hey! Scripting Guys! Blog

Ed wkłada wiele pracy nie tylko w przygotowanie zadań, ale również w przygotowanie uczestników. Na jego blogu jest dedykowany pod tegoroczne Scripting Games “Study Guide”. To nie tylko źródło wiedzy, to również swoista wskazówka: czego można się spodziewać w ramach poszczególnych konkurencji. Dla osób “zielonych” w temacie ciekawym źródłem wiedzy (w dodatku świetnie napisanym) będą artykuły z udziałem Scripting Wife. Ponieważ żona Eda nie jest “geekiem”, jej punkt widzenia może służyć tym, którzy w PowerShellu stawiają pierwsze kroki. Do tego dwie serie zarejestrowanych webcastów (w sumie 10 godzin pełnych informacji dotyczących PowerShella). Nie wspominając o setkach innych artykułów: każdy z nich może zawierać informacje pomocne przy rozwiązywaniu zadań. Pomijając same Scripting Games, to chyba jedno z lepszych źródeł wiedzy o PowerShellu dostępnych online (i naturalnie za darmo). Polecam!

3… IRC

Usługa zapomniana i porzucona przez wielu, obca i niezrozumiała dla pozostałych. Winking smile A jednak: na IRC istnieje miejsce, gdzie można spotkać miłośników PowerShella niemal codziennie, o dowolnej porze dnia i nocy. Ponieważ spotykają się tam ludzie z Europy, Ameryki, Australii, Azji, być może również Afryki (tu pewności nie mam) – można spodziewać się tam kogoś “aktywnego” o dowolnej porze dnia i nocy. Co jest dość istotne i pomocne: by tam się dostać nie trzeba instalować klienta irca: jeśli chcesz najpierw przekonać się, czy to w ogóle dla Ciebie możesz skorzystać z udostępnianej przez freenode wersji web – sam z niej korzystałem kilkakrotnie. Jestem tam częstym gościem, można tam też spotkać innych MVP, MCC lub po prostu entuzjastów PowerShella, którzy lubią rozmawiać o nim i dzielić się swoją wiedzą. Oczywiście, wiele tematów nie ma z nim nic wspólnego, w końcu to IRC… Winking smile Nikt nie moderuje rozmów by zagwarantować, że wszystkie będą on-topic. Temat Scripting Games często tam wypływa. Można też czasem uzyskać pomoc odnośnie miejsca, gdzie umieszczane są skrypty: Joel (Jaykul), autor i właściciel poshcode.org, jest tam bardzo częstym gościem. Czy może raczej gospodarzem. Smile

2… Twitter

O wiele nowocześniejszy wynalazek do kontaktowania się z innymi ludźmi. Moim zdaniem – często zbyt ograniczony (lubię się rozpisać, więc 140 znaków w 9 przypadkach na 10 to dla mnie za mało). Plusem niewątpliwym jest fakt, że na Twitterze znajdziecie wielu ekspertów w zakresie PowerShella, którzy na IRCa nie zaglądają. Jeśli masz pytanie – wyślij je oznaczając tagiem #PowerShell – szansa, że uzyskasz odpowiedź jest bliska pewności. Scripting Games mają swój własny tag: #2012SG. To dwa sposoby, by uzyskać pomoc, gdy w czasie pisania skryptu napotkasz “ścianę”. Jeśli nie korzystałeś z Twittera to mogę śmiało zachęcić, wiele razy rozwiązywałem problemy/ szukałem tam rozwiązania. W zasadzie niezmiernie rzadko wysyłam informację o rzeczach nietechnicznych. Przyda się zarówno w trakcie Scripting Games, jak i po ich zakończeniu. Smile

1… Google

Nie napiszę Bing, bo po prostu nie korzystam z niego. Winking smile Z Google korzystam bardzo często rozwiązując problemy jakie napotykam w pracy. W czasie ostatnich Scripting Games również korzystałem z niego wielokrotnie. Nie wszystko można znaleźć w Get-Help, bo nie wszystko w Scripting Games skupia się na PowerShellu – czasem musimy dowiedzieć się nowych rzeczy o samym systemie Windows, o Active Directory, o platformie .NET, by stworzyć skrypt spełniający kryteria zadania. Jedna rada: jeśli traficie na coś nieoczywistego przy pomocy google – dla dobra własnego i wszystkich ludzi, którzy w przyszłości korzystać będą z Waszego skryptu, umieśćcie w nim komentarz z linkiem do strony, która pomogła Wam znaleźć rozwiązanie. Po co powtarzać googlowanie w przyszłości?

Podsumowanie

Nasz cykl powoli dobiega końca. Ostatnia część będzie poświęcona kategoriom, mam nadzieję, że pomoże ona niezdecydowanym podjąć jedyną słuszną decyzję. Winking smile

Scripting Games 2012–Odliczanie: 6…

•27 marca, 2012 • Dodaj komentarz

Za tydzień Scripting Games będą już rozpoczęte, a ja pewnie będę zajęty sprawdzaniem tego, co napisali “sprinterzy”. Winking smile Będę też zajęty przygotowaniami do prezentacji na 40-tym spotkaniu WGUiSW. Tym razem poopowiadam o PowerShellu v.Next, z silnym akcentem na te elementy nowej odsłony, które powinny ułatwić korzystanie z niego zarówno osobom znającym go już dość dobrze, jak i początkującym. Więcej szczegółów odnośnie spotkania na stronie grupy. Powiem Wam tylko, że będzie to mocno PowerShellowe spotkanie, bo przede mną ma jeszcze prezentację Grzegorz Gałęzowski. Już nie mogę się doczekać. Smile A dziś…

6 Powodów, by uczestniczyć

Rozpisałem się poprzednio co w Scripting Games robić należy, a czego należy unikać. Ale co, jeśli ktoś w ogóle nie rozważa uczestnictwa? Cóż, jeśli ktoś lubi pisać skrypty, lubi obcować z PowerShellem – to troszkę mu się dziwię. Ale ponieważ mam świadomość, że czasem marchewka musi być nieco większa, to dziś wspomnę właśnie o marchewce. Wszystkie wymienione poniżej punkty, poza ostatnim może, wymagają tylko udziału w wybranych “eventach” – nikt nie ma obowiązku walczyć do ostatniego skryptu o główną nagrodę. Korzyść, moim zdaniem, płynąć będzie z uczestnictwa również w jednej “odsłonie”. Smile

6… Nauka

Lubicie się uczyć? Jeśli nie, to chyba wybraliście zły zawód. Smile with tongue out Środowisko IT jest dynamiczne i wręcz wymusza ciągłe dokształcanie się. Ale nauka nie musi oznaczać czytania opasłych tomisk, czy nudnych (?) zewnętrznych szkoleń. Oczywiście zawsze można znaleźć lepsze książki, bardziej inspirujące szkolenia (polecam Almado w tym względzie…), ale czy nie lepiej po prostu połączyć naukę ze świetną zabawą? Scripting Games to swoisty trening mózgowych muskułów, który poniekąd zmusza nas by spojrzeć na swoje skrypty krytycznie, ale również – a może przede wszystkim – przyjrzeć się technologiom i problemom, z którymi nie mieliśmy okazji się wcześniej zetknąć. A ponieważ problemy w Scripting Games są raczej realistyczne i dotyczą naszej pracy – korzyść może być odczuwalna w przyszłości, gdy napotkamy problem uwzględniony w jednej z konkurencji (lub zbliżony) i z przyjemnością stwierdzimy, że “do tego to ja już mam skrypt”. Win-win. Winking smile

5… Zabawa

Radość z udziału w Scripting Games płynie z kilku źródeł i w znacznym stopniu zależy od nastawienia. Jeśli lubicie pisać skrypty – to okazja by ich napisać 10 w tak krótkim czasie może być bardzo apetycznym “ciachem”. Inni będą czerpać przyjemność z rywalizacji. Jeszcze inni: z komentarzy i ocen wypieszczonego skryptu (choć tu oczywiście może być akurat na odwrót…) Jeszcze inni: z uczestnictwa w czymś dużym i możliwości “wypromowania” swojego nazwiska i pokazania światu jakości swoich skryptów. Uczestniczyłem w Scripting Games dwukrotnie, za każdym razem cieszył mnie każdy skrypt umieszczony na poshcode – część zadań była bardzo wymagająca i świadomość ich ukończenia daje niesamowitą satysfakcję.

4… Codzienne nagrody

Scripting Games, jak to już miało miejsce w latach ubiegłych, da Wam możliwość wygrania nagrody w losowaniu. Każdego dnia między osobami, które tego dnia opublikowały skrypty, losowane są fanty. Można wygrać co prawda tylko jeden z nich, ale każdy dodany skrypt zwiększa prawdopodobieństwo wygranej. Większość nagród związana jest z PowerShellem: książki, płatne wersje edytorów, narzędzia firm trzecich, szkolenia… Oczywiście, jeśli wyślecie tylko jeden skrypt – to wygranie nagrody wymaga odrobiny szczęścia. Jeśli komplet to jej nie wygranie – pecha. Winking smile

3… Możliwość sprawdzenia się

Wiele osób ceni sobie w życiu wyzwania. Dla osób, które nie zetknęły się wcześniej z PowerShellem (poza kopi-pejst z google) wyzwaniem może być samodzielne rozwiązanie zadań kategorii początkujących. Jeśli ktoś pisuje skrypty regularnie, wyzwaniem może być napisanie kompletu w kategorii zaawansowanej w tak krótkim czasie. A zdarzają się zadania, które naprawdę wymagają masy pracy i czasu (a także wiedzy). W dodatku oceniany jest również “styl” co dla osób piszących skrypty jednorazowe może oznaczać kolejne wyzwanie: pisanie skryptów, które mogą przeczytać i zrozumieć inni. Lub oni sami po kilku miesiącach. Smile

2… Nowe znajomości

Scripting Games to oczywiście – jak w każdej grze – rywalizacja. Ale ze względu na charakter tej rywalizacji służy ona poznawaniu innych ludzi. W czasie udziału poznałem wielu innych uczestników, lub osób stojących z boku i obserwujących całą imprezę. Ciekawe jest też poznawanie “umysłów” innych: przez porównanie rozwiązań problemów, które czasem bywają znacząco różne, uczymy się myśleć “poza pudełkiem”, co z pewnością wspomaga rozwój nie tylko w zakresie PowerShella. Nie można też wykluczyć zwycięstwa a wtedy okazji do poznania innych ludzi (czasem naprawdę wyjątkowych) będzie jeszcze więcej. Co prowadzi nas do powodu szóstego, zarezerwowanego dla tych, którzy “pójdą na całość” niezależnie od wybranej kategorii.

1… TechEd! Jeffrey Snover! PowerScripting Podcast!

Główne nagrody w Scripting Games są naprawdę wyjątkowe. TechEd to droga impreza, sam w życiu bym się chyba nie zdecydował by zapłacić za udział w niej z własnej kieszeni. Co prawda jest to doskonała okazja by poznać naprawdę wyjątkowych ludzi, ale jednak cena (przynajmniej dla mnie) jest zaporowa. Nawet cena lotu w obie strony za ocean wraz z kosztem hotelu w sumie sięga mniej-więcej połowie ceny udziału w tej konferencji. I jeśli wygrasz tę nagrodę i masz dość pieniędzy/ pracodawcę który weprze Cię w tej wyprawie – nie zastanawiaj się. Pamiętaj – nie pojedziesz tam jako szary uczestnik, lecz jako zwycięzca Scripting Games. To naprawdę robi wielką różnicę. Jeśli jednak na podróż z różnych powodów nie możesz sobie pozwolić, to zawsze zostaje nagroda, którą miałem okazję już cieszyć się dwukrotnie. Czy słyszałeś kiedykolwiek o PowerScripting Podcast? Jeśli nie, to zachęcam, by się nim zainteresować, to moim zdaniem jedno z najlepszych źródeł wiedzy o PowerShellu. Jednym ze stałych elementów jest wywiad z ludźmi z PowerShellowego światka. Takimi jak pomysłodawca, “ojciec” PowerShella, Jeffrey Snover. Albo Scripting Guy, Ed Wilson. Nagroda pocieszenia to uzupełnienie tej PowerShellowej układanki swoim nazwiskiem, swoim głosem. Smile Wymaga to co prawda zerwania się z łóżka w środku nocy (podcast jest nagrywany wieczorem czasu amerykańskiego, więc około 3 w nocy naszego czasu), ale myślę że możliwość zadania pytań człowiekowi, który wymyślił PowerShella może być czymś wyjątkowym. Wszystko jest rejestrowane i zachowane dla potomnych…

Podsumowanie

Czas nam się kurczy, pozostaje już tylko wspomnieć o dwóch rzeczach: gdzie (moim zdaniem) najlepiej szukać pomocy oraz nieco szerzej poopowiadać o dwóch kategoriach i gdzie ewentualnie szukać wskazówek, w jakie kategorii powinniśmy spróbować swoich sił. Mam nadzieję, że dzisiejszy post przekonał wszystkich, że jeśli czas pozwala, to tylko wybór kategorii jest sprawą otwartą, udział jest oczywistą koniecznością. Winking smile

Scripting Games 2012–Odliczanie: 8…

•25 marca, 2012 • Dodaj komentarz

Zegar tyka…

Już tylko 8 dni…

Dwa dni temu przedstawiłem moje propozycje: co moim zdaniem powinno się robić, by sędziowie byli zadowoleni z pisanych przez Was skryptów. Oczywiście, każdy sędzia jest nieco inny i co innego będzie miało dla niego znaczenie, ale sądzę, że lepiej wiedzieć czego się spodziewać, nawet jeśli gdzieś może się trafić Hiszpańska Inkwizycja. Jej nie spodziewa się nikt. Winking smile

O czym dziś będzie mowa, już wspominałem:

8 rzeczy, których należy unikać

Są pewne rzeczy, które na PowerShellowych “purystów” działają jak płachta na byka. Dziś zamierzam wymienić te, które mi osobiście wadzą najbardziej i które, z własnego doświadczenia jako uczestnika, najboleśniej odpokutowałem. Winking smile

8… Write-Host.

O tym cmdlecie napisano już wiele. Problem z nim polega na tym, że często jest nadużywany do rzeczy, do których go nie stworzono. Można go czasem użyć, by wyświetlić na ekranie bajecznie kolorowe komunikaty o statusie (z tą bajecznością to niestety lekko przesadzam, jesteśmy zamknięci w 16-kolorowej klatce). Ale nigdy, przenigdy nie używajmy go do wyświetlania istotnych wyników. Taki wynik, jak sama nazwa cmdletu wskazuje, zostanie “pożarty” przez naszego hosta. Jeśli nasz skrypt/ funkcja mają komukolwiek posłużyć to nie mogą ograniczać się do jednego “ujścia”. Przekierowanie takiego wyniku gdziekolwiek (do innego polecenia, do pliku, na drukarkę) jest już praktycznie niemożliwe. Idealne ujścia dla informacji o statusie bieżącej operacji wewnątrz naszego skryptu, fatalne dla ostatecznego wyniku jego działania. A ponieważ niektórzy nabawili się przez to alergii na cmdlet w ogóle, proponuję status wyświetlać opcjonalnie (Write-Verbose/ Debug), lub używając poleceń Write-Progress (które mają tę przewagę, że łatwo je aktualizować nie zalewając użytkownika informacją).

7… Miksowanie typów na wylocie.

Pisałem, że na wyjściu naszej funkcji powinny znajdować się obiekty. Ale muszą to być obiekty jednego typu – mieszanie różnych typów zwykle kończy się fatalnie i powoduje nieoczekiwane rezultaty. Źródła “mieszania” są w zasadzie trzy głównie:

  • osadzone w treści stringi. Ładnie wyglądają, ale niestety lądują w wyniku funkcji.
  • korzystanie z metod .NET bez dbania o ich rezultat: często zwracają one jakieś liczby (indeks) lub wartości logiczne ($true/ $false)
  • założenie, że funkcja zwraca tylko to, co znajduje się po “return”, wiąże się z poprzednimi dwoma…

Dla przykładu:

function Get-List {            
param (            
    [Object[]]$Member            
)            
            
    $Collection = New-Object System.Collections.ArrayList            
    "Dodajemy elementy do kolekcji..."            
    foreach ($Item in $Member) {            
        $Collection.Add($Item)            
    }            
    , $Collection            
                
}            
            
$List = Get-List -Member Alfa, Beta, Gamma            
$List.Count

Wynik “powinien” być 1 (temu służy przecinek poprzedzający $Collection, w przeciwnym razie PowerShell “rozbije” nam kolekcję i zwróci zwykłą listę). Nie ma tu nawet jednego return, a mimo to wynik jest 5: mamy w wynikowej kolekcji stringa (nasz komunikat), liczby całkowite (rezultat użycia metody ‘Add’) i naszą kolekcję. Naturalnie, kolekcja nie ma nic wspólnego z ArrayList, ten typ jest tylko jednym z jej elementów. A wystarczyłoby:

  • użyć Write-Host lub jeszcze lepiej: –Verbose, –Debug lub –Progress zamiast wrzucania zwykłego stringa
  • przekierować metody .NET na $null, Out-Null, czy w inny sposób je “uciszyć”
  • używać return tylko do tego, do czego w PowerShellu służy (wcześniejsze wyjście z funkcji w oparciu o jakiegoś ifa np.)

6… Pisanie własnej pomocy.

Intencje są słuszne (pomoc jest przydatna, pisałem już o tym dwa dni temu). Rozwiązanie – fatalne. Dodanie parametru ‘?’ do naszej funkcji nie jest konieczne od wersji drugiej PowerShella. Funkcja, która coś takiego obsłuży będzie i tak albo zbyt wylewna, albo zbyt powściągliwa. Nie da nam możliwości (łatwej) podania parametrów takich jak Full, czy Examples. Napracujemy się bardzo, a i tak nikt tego nie doceni. Dlaczego? Ponieważ jeśli ktoś nie używa narzędzi skutecznych i wbudowanych to udowadnia, że ich nie zna. A to nigdy nie świadczy na naszą korzyść. Zamiast obszernej funkcji – kilka linii komentarza. Prościej, czytelniej i skuteczniej.

5… Samodzielne walidowanie parametrów.

Znów: prawdopodobnie w 9 przypadkach na 10 skutek nieznajomości funkcji języka. PowerShell umożliwia nam walidowanie parametrów na wiele różnych sposobów, włącznie z walidowaniem przy pomocy własnego skryptu. Jeśli więc początek Twoich funkcji to banda ifów sprawdzających wartość parametrów, to prawdopodobnie robisz to źle. Jest tylko jeden przypadek, gdy taka walidacja ma sens: jeśli walidować musimy kilka parametrów jednocześnie ($Pensja –gt $Wydatki). Tego PowerShell nie umożliwia, musimy więc go wyręczyć. Ale to właśnie te 1 na 10 przypadków. A może nawet 1 na 100…?

Jeśli więc chcecie walidować parametry (a robić to warto, by nie doprowadzić do nieoczekiwanych rezultatów), polecam lekturę about_Functions_Advanced_Parameters. Można też sięgnąć do mojego starszego postu, gdzie wymieniam dostępne opcje. Tu – prosty przykład. Podajemy funkcji ścieżkę do pliku, który musi istnieć by funkcja zadziałała, korzystając więc z ValidateScript upewniamy się, że tak jest w istocie:

function Get-FileStatistic {            
param (            
    [ValidateScript( {            
        Test-Path -Path $_            
    })]            
    [string]$Path            
)            
    Get-Content $Path | Measure-Object -Word -Line -Character |            
        Select-Object Words, Lines, Characters            
}

Przykład bardzo prosty ale obrazuje, jak niewiele trzeba, by nasz parametr miał sensowną wartość.

4… Aliasy, szczególnie mało czytelne.

Alias w konsoli to błogosławieństwo, w skrypcie – przekleństwo. Przede wszystkim może zmniejszyć jego czytelność. O ile aliasy takie jak ‘select’, ‘where’, czy ‘measure’ są dość powszechnie używane i zrozumiałe, o tyle rzadziej stosowane (sl?) mogą sprawić kłopot nawet osobom, które z PowerShellem pracują każdego dnia. Odradzam też powszechne skrótowce “%” i “?” – oczywiście, wiele osób zna je już dobrze, ale w skrypcie moim zdaniem są przeszkodą w jego łatwym odczytaniu i zrozumieniu. A jeśli ktoś posłuży się naszym skryptem jako inspiracją i zechce go zmodyfikować, to może się na nich “potknąć”. Pisząc skrypt nie musimy oszczędzać palców: piszemy go raz i później (przynajmniej z założenia) głównie korzystamy. Więc zysk jest iluzoryczny, lepiej jednak postarać się i użyć pełnej nazwy komendy. Jest też jeszcze jedno zagrożenie: polegamy w naszym skrypcie na istnieniu aliasu, który ktoś świadomie na swoim komputerze usunął. Wówczas użytkownik naszego skryptu może spędzić sporo czasu próbując ustalić, gdzie tkwi błąd. Na tyle dużo, że potencjalny sędzia uzna po prostu, że Wasz skrypt nie działa wcale. Po co ryzykować? Smile

3… Niezrozumiałe nazwy zmiennych.

Ocenianie skryptów czasem musi się ograniczyć do ich przejrzenia, testowanie wszystkich może się okazać niemożliwe. Używając nazw zmiennych, które trudno później śledzić (a, b, c, pc, pr) oszczędzacie nieco czasu w czasie pisania, ale praktycznie uniemożliwiacie rozumienie logiki “na pierwszy rzut oka”. Skrypt nie przyspieszy od nazwania zmiennej krótszą nazwą, a zarówno Wam, jak i osobom czytającym Wasz skrypt będzie łatwiej, jeśli zmienne będą miały sensowne nazwy. Oczywiście, zalecam nazwy angielskie… Nie dlatego, że nie lubię mowy ojczystej. Po prostu język angielski lepiej lub gorzej znamy (niemal) wszyscy, nikt więc nie będzie miał wątpliwości co kryje się pod zmienną “Path”. “Sciezka” może kogoś zbić z pantałyku… Winking smile

2… Łamanie linii przy pomocy backticka.

W PowerShellu koniec linii na ogół tożsamy jest z końcem wyrażenia, czego skutkiem jest jego wykonanie. By tego uniknąć często w skryptach korzysta się ze znaku “odwołującego” tę właściwość końca linii, “`”. Osobiście odradzam tę technikę. Wystarczy że ktoś nieumyślnie wstawi spację tuż po tym znaku i działająca komenda nagle zaczyna sprawiać problemy. Zamiast tego proponuję łamać linie na znakach, które tego feleru nie mają:

  • | –> czyli następna komenda w “rurce” ląduje w kolejnej linii
  • ( –> czyli dalsza część prostego wyrażenia przenosi się do linii kolejnej
  • { –> rozpoczynamy ScriptBlock w pierwszej linii, kontynuujemy w następnej
  • , –> lista można w prosty sposób “rozrzucić” na kilka linii

Gorzej, gdy pojedyncza komenda ma tak wiele parametrów, że można albo mieć linię o szerokości 300 znaków, albo użyć backticka. W takiej sytuacji – polecam metodę nazywaną “splatting”:

# Podajemy wartość "na sztywno" ale mogłaby być parametrem...            
$ComputerName = '.'            
            
$Opcje = @{            
    LogName = 'System'            
    Newest = 10            
    After = (Get-Date).AddDays(-1)            
    EntryType = 'Error'            
    Source = 'Service Control Manager'            
    ComputerName = $ComputerName            
}            
            
Get-EventLog @Opcje | select Message, TimeGenerated

Pozwala ona też prosto “współdzielić” parametry między komendami, jeśli są jakieś punkty wspólne. Jest też wiele innych korzyści wynikających z korzystania ze splattingu. Korzyści z backticka nie ma w zasadzie żadnych, przynajmniej do łamania linii (w innych miejscach nie niesie ze sobą takich zagrożeń).

1… Komentowanie rzeczy oczywistych.

Komentarze w funkcjach to rzecz dobra, warto czasem opatrzyć jakieś nieoczywiste operacje komentarzem, by osoba przeglądająca skrypt wiedziała dlaczego postępujemy tak, a nie inaczej. Ale trzeba wystrzegać się pisania rzeczy trywialnych i oczywistych. Prosty przykład:

# Czytam zawartość pliku...            
$Content = Get-Content -Path $Path            
            
# Filtruje tylko te linie, które zawierają słowo "error"            
$Errors = $Content | where { $_ -match 'error' }            
            
# Zapisuje do pliku $OutPath            
Set-Content -Path $OutPath

Pomijając jakość samego kodu: czy choć jeden komentarz coś wnosi? Wyjaśnia logikę naszego działania? Informuje nas o czymś, czego nie da się wyczytać ze samej składni? Teraz porównajmy to z przykładem pozytywnym…:

            
# Używam -FilterXml: tylko 2008 R2 i nowsze pozwala na użycie HashTable.            
Get-WinEvent -FilterXml $SomeXML -ComputerName $Computer

I już nie przyjdzie mi do głowy pytanie: czemu nie użyto łatwiejszego do zbudowania –FilterHashTable… Smile Skoro skrypt ma zadziałać na serwerze 2008, to nie można użyć parametru, którego ta wersja serwera nie akceptuje.

Podsumowanie.

Wiemy już czego unikać, co robić. Pytanie kolejne: po co w ogóle mam sobie zawracać tym głowę. Już pojutrze: 6 powodów, by uczestniczyć.

Scripting Games 2012–Odliczanie: 10…

•23 marca, 2012 • 2 Komentarze

Za dziesięć dni rozpocznie się święto miłośników PowerShella – Scripting Games. Dwa tygodnie przepełnione pisaniem skryptów (uczestnicy) i ich czytaniem/ testowaniem (sędziowie). W tym roku mam zaszczyt znajdować się w tej drugiej kategorii, nie mam więc szans, by obronić tytuł z zeszłego roku. Aby więc laur zwycięzcy pozostał w kraju nad Wisłą postanowiłem się podzielić moimi spostrzeżeniami odnośnie Scripting Games. Przede wszystkim: wyedukować, czy raczej – podzielić się kilkoma uwagami, które mogą pomóc uniknąć błędów. Później: zachęcić, wszak każdy lubi, gdy jego wysiłek jest stosownie (wy)nagrodzony. Wreszcie: pomóc wybrać odpowiedni poziom.  Ale po kolei. Dziś:

10 rzeczy, które powinno się robić.

Dla wielu spośród uczestników będą to banały, ale czasem lepiej pewne rzeczy powtórzyć, bo a nuż widelec komuś się to czy owo “zapomniało”…

10… Zaawansowane funkcje.

W kategorii “początkujących” może się to wydawać lekką przesadą. I naturalnie, nie ma sensu “pakować” w stosowne dekoracje kodu, który zajmuje jedną linię. Z drugiej strony [CmdletBinding()] to tylko 17 znaków, a dają nam sporo w zamian. Naprawdę, funkcja korzystająca z $args trąci myszką. PowerShell daje nam tę elastyczność, ale jeśli piszemy coś na konkurs, to lepiej pokazać, że znamy się na temacie. Kundelki są śliczne, ale na wystawę psów ich nikt (chyba?) nie prowadzi. Zaawansowana funkcja, to funkcja “rasowa”. W rękach wprawnego skrypciarza – medalowa wręcz. Smile

9… Obiekt na wyjściu.

Funkcja w PowerShellu zwraca obiekty. KROPKA. Jeśli napisałeś ostatnio funkcję, która robi coś innego – przepisz to zdanie 100 razy na tablicy. Jeśli funkcja nie zwraca obiektów, to jest jednorazowa. Jeśli zwróci obiekt – można ją wpleść w zgrabną rurkę i mieć z niej pożytek jeszcze wiele razy. Warto też przyjrzeć się parametrom, szczególnie w kategorii zaawansowanej. Jeśli jest sens, by jakiś parametr “pobierał” obiekty (lub też ich właściwości) z rurki – grzechem zaniedbania będzie pominięcie tego. Znów: troszkę się trzeba z tym “naklikać”, ale późniejsze użycie może się okazać po wielekroć przyjaźniejsze użytkownikowi.

8… Comment Based Help.

Jeśli piszesz funkcję i wymagasz, by wszyscy przejrzeli Twój skrypt by się dowiedzieć co robi (lub co gorsza: zakładasz, że na pewno odgadną co autor miał na myśli), to właśnie strzeliłeś komuś w stopę. Co gorsza: tym kimś możesz być Ty, za kilka miesięcy, o trzeciej nad ranem desperacko próbujący rozwiązać jakiś problem przy pomocy tej właśnie funkcji. Jak myślisz, co pomyślisz o tym leniu, któremu zabrakło energii, by funkcję wyposażyć w zrozumiałą i kompletną pomoc? Przecież to raptem kilka linii komentarza. W zasadzie podstawowy opis, do tego kilka przykładów – i pomoc gotowa. Get-Help to o wiele bardziej przyjazna metoda zapoznawania się z komendami w PowerShellu, niż notepad.

7… Write-Verbose i Write-Debug.

Mamy funkcję zaawansowaną (mamy, prawda?), więc skorzystajmy z tego, co ona nam oferuje. Robisz w funkcji coś “przełomowego”, gdzie potencjalnie może coś się nie udać? Daj szansę użytkownikowi wyświetlić informację, co próbujesz zrobić. Wyrzucenie informacji Verbose/ Debug zawierającej wartości zmiennych, parametrów, czy po prostu informujące o stopniu zaawansowania przydadzą się nie tylko w czasie testowania skryptu, ale również później, gdy nagle coś przestanie działać. Ponieważ domyślnie te informacje są ukryte, to nie zaśmiecamy nikomu konsoli. Dopiero gdy sam o to poprosi – robimy się wylewni. Złoty środek. Smile

6… Obsługa błędów.

Błędy czasem można przewidzieć. Jeśli przewidujesz błąd – obsłuż go. Straszenie ludzi, że dzieje się coś złego, gdy w istocie dzieje się coś przewidywanego i naturalnego jest marnym pomysłem. Narzędzia zbyt hałaśliwe i zbyt “płochliwe” mogą zniechęcić każdego. Jeśli więc da się obsłużyć jakiś błąd – zróbmy to. I nie mam tu bynajmniej na myśli:

try {            
    # kod naszej funkcji            
} catch {}

To nie obsługa błędów, to proszenie się o kłopoty. Winking smile

5… Testuj na “gołym” PowerShellu.

Maszyna miłośnika skryptów to często swoisty bazar. Moduły, funkcje, skrypty i profile pałętają się po całym twardym dysku i nigdy nie wiadomo, który akurat “wyręczy nas” przy definiowaniu elementów wykorzystywanych w naszym skrypcie. Problem polega na tym, że sędziowie skrypt będą raczej testować na innym komputerze i nagle skrypt zasypie ich stronami niezrozumiałych błędów. Jak tego uniknąć? powershell.exe –noprofile, to najlepsza możliwa odpowiedź. Najlepiej (na wszelki wypadek) uruchomić go ponownie tuż przed ostateczną kontrolą. Jeśli jak ja – od dawna macie na swoim komputerze PowerShella 3 – możecie zechcieć dorzucić tam też przełącznik “-version 2”. Chyba że faktycznie chcecie skrypt pisać pod wersję trzecią – pamiętajcie wtedy jednak o parametrze #requires. Pamiętajcie też: skrypt raz wrzucony na poshcode pozostanie niezmienny, zawsze więc przed opublikowaniem tam: testujemy, testujemy, testujemy.

4… KISS.

Prosto. Jeśli da się cmdletem – nie twórzmy klas w .NET. Jeśli da się parametrem – nie filtrujmy przy pomocy Where-Object. Dobry skrypt nie musi być długi, więcej nawet – często to właśnie te krótsze są o wiele lepsze, gdyż łatwiej je ogarnąć i zrozumieć ich logikę. Sam wiele razy popełniałem ten błąd, więc wiem co mówię. Nie dać się ponieść, skupić się na zadaniu, upraszczać by zwiększyć przejrzystość. Prosto do celu.

3… Stosować cmdlety, jeśli istnieją.

Troszkę wpisuję się to w ideę KISS, ale tu bardziej chodzi o nie odkrywanie na nowo koła. Pisanie funkcji, która zrobi to samo co istniejący cmdlet (tylko gorzej) mija się z celem. Po to Bozia dała nam Get-Command, byśmy mogli w razie czego poszukać gotowego narzędzia, które wykona za nas najcięższą robotę. Nikt nie nagrodzi nas za napisanie na nowo Get-Member, szczególnie gdy nasze zadanie dotyczy kompletnie innych rzeczy.

2… Brać sobie do serca komentarze/ artykuły sędziów.

Skrypt opatrzony przez sędziego komentarzem daje nam możliwość pracowania nad swoimi umiejętnościami. Zakładam oczywiście, że komentarz ma sens (co jest raczej regułą). Dodatkowo w zeszłym roku kilku sędziów w czasie trwania SG publikowało na swoich blogach wskazówki, które pomagały uniknąć błędów innych (przynajmniej w kolejnych zadaniach). W tym roku pewnie będzie podobnie. Te dwa źródła informacji mogą pomóc tu i teraz (przy kolejnych konkursowych skryptach) jak i w przyszłości (w czasie pisanie skryptów “produkcyjnych”).

1… Porównać swoje rozwiązanie z rozwiązaniami innych.

Takie porównanie pozwala często dostrzec rysy we własnej logice, oraz wskazać inne drogi (być może skuteczniejsze, bądź wydajniejsze) prowadzące do tego samego celu. Warto przyjrzeć się zarówno skryptom uznanym za najlepsze, jak i tym, które uzyskały noty najniższe: to pozwoli nam samodzielnie ocenić: na którym miejscu na skali znajdują się obecnie nasze umiejętności. Na koniec gier pojawiają się też rozwiązania ekspertów. I choć sam kilka razy nie do końca zgadzałem się z rozwiązaniami, które tam można było znaleźć, to dobrze jest móc porównać swoją pracę, z pracą ekspertów. Dzięki temu wyciśniemy z Scripting Games ostatnie soki. Smile

Podsumowanie

Czas leci… Dziś przyjrzeliśmy się temu, co robić należy. Za dwa dni: 8 rzeczy, których należy unikać. Naturalnie, jeśli niebo nie zawali mi się na głowę.

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

•17 marca, 2012 • Dodaj komentarz

Dziś wracamy do tematu modułów w PowerShellu. Uznałem, że jeśli teraz nie przysiądę i nie dokończę tego cyklu – to nie zrobię tego w najbliższej, dającej się przewidzieć przyszłości. Poprzednio opisałem podstawy tworzenia modułów, dziś – pora na manifest i pliki definiującej typy i format ich wyświetlania.

Manifest to prościutki skrypt PowerShella. W zasadzie zawiera on jedną tablicę skrótów z kluczami odpowiadającymi właściwościom/ ustawieniom modułu. Korzystamy przy tym z rozszerzenia .psd1, które wykorzystywane jest w zasadzie tylko w tym celu.

Nasz manifest

Manifest najprościej jest stworzyć przy pomocy polecenia New-ModuleManifest. Polecenie to spyta nas w zasadzie o wszystkie elementy, które do stworzenia manifestu są niezbędne. Większość kluczy ma dość jednoznaczne nazwy, zatrzymać się chciałbym w zasadzie przy dwóch: TypesToProcess i FormatsToProcess.

Oba klucze przyjmują tablicę stringów, w której zawrzeć możemy ścieżkę do wszystkich plików .ps1xml dotyczących naszego modułu. Pliki te służą definiowaniu dla istniejącego typu (czy to typu “prawdziwego”, czy też “wirtualnego”, stworzonego przez nas na potrzeby modułu) dodatkowych właściwości i metod (TypesToProcess) oraz sposobów wyświetlania (FormatsToProcess). Pliki .ps1xml to całkowicie odrębny temat, w dodatku dość obszerny. W wielkim skrócie można napisać, że są to pliki XML o zdefiniowanym schemacie, dzięki którym możemy “centralnie” przeprowadzać operacje podobne do tych, które wykonujemy przy pomocy poleceń takich jak Format-Table, czy Add-Member.

Manifest pozwoli nam powiązać te pliki z naszym modułem, dzięki czemu obiekty tworzone przy jego pomocy będą wyglądać tak, jak my sobie tego zażyczymy. By jednak obiekty przez nas generowane wyróżnić z tłumu innych, zwłaszcza jeśli nie chcemy dodawać “prawdziwego” typu poleceniem Add-Type, musimy skorzystać z jednej, dość prostej techniki, by nasze obiekty miały stosowną “metkę”.

Pseudo-typ i pliki PS1XML.

Skuteczne korzystanie z plików typów/ formatów wymaga od nas trzech rzeczy. Po pierwsze: funkcje tworzące nasz wymarzony obiekt muszą go odpowiednio “oznakować”:

function Get-Foo {            
param (            
    [Parameter(ValueFromPipeline = $true)]            
    [string]$Bar            
)            
            
process {            
    $Out = New-Object PSObject -Property @{            
        One = 1            
        Two = $Bar            
    }            
    $Out.PSTypeNames.Insert(0,            
        'Typ.Wymarzony'            
    )            
    $Out            
}            
}

Druga rzecz, to dodać ten wirtualny typ do naszych plików PS1XML w odpowiednim miejscu, zarówno w pliku opisującym formatki:

<Configuration>

       <ViewDefinitions>

              <View>

                     <Name>Wymarzony.FT</Name>

                     <ViewSelectedBy>

                           <TypeName>Typ.Wymarzony</TypeName>

                     </ViewSelectedBy>

… jak i pliku opisującym rozszerzenia naszego typu:

<?xml version="1.0" encoding="utf-8" ?>

<Types>

    <Type>

        <Name>Typ.Wymarzony</Name>

        <Members>

Jak widać nie wymagało to wielkiej pracy, a efekt jest zwykle zadowalający. Zamiast dość losowego wyniku i obiektu bez żadnych “specjalnych” właściwości i metod możemy uzyskać zwierza, który wyświetlany będzie w sposób dla nas wygodny i będzie gotowy wykonać dla nas wybrane przez nas zadania:

BlogMod

To wszystko można oczywiście zrobić również bez modułu, ale moduł czyni te operacje o wiele prostszymi i daje nam (przy pomocy pliku manifestu) bardzo dokładną kontrolę.

$Env:PSModulePath czyli o instalacji modułu

Moduły można, jak widać na załączonym zrzucie ekranu, importować bez większego trudu z dowolnego miejsca na dysku. Istnieje jednak zmienna środowiskowa, która definiuje kilka folderów, z których import będzie o wiele prostszy. PSModulePath przypomina nieco zmienną PATH: ma identyczną składnię, lista folderów jest rozdzielona średnikami:

BlogModPath

Poprawna struktura:

Schemat

Ponieważ zdarzyć się może, że zrobimy literówkę w nazwie pliku lub folderu (a raczej ze względu na to, że sam kiedyś zmarnowałem sporo czasu próbując ustalić, czemu jeden z moich modułów nie działał poprawnie) stworzyłem wieki temu funkcję, która sprawdzi poprawność tych nazw i jeśli się na to zdecydujemy – błędy te naprawi. Na tym kończę serię dotyczącą efektywnego PowerShella. Troszkę się zeszło… Winking smile

2012 Windows PowerShell Scripting Games

•19 lutego, 2012 • Dodaj komentarz

8203.hsg-2-4-12-1Jeśli ktoś jeszcze o tym nie słyszał: już wkrótce rozpocznie się kolejna edycja Scripting Games. Kolejna okazja dla każdego miłośnika PowerShella (przyszłego, bądź obecnego) by zmierzyć się z zadaniami wymyślonymi przez “The Scripting Guy(s)!”, Eda Wilsona.

Tak jak w zeszłym roku: zadania podzielone będą na dwie kategorie. Kategoria dla początkujących ma być znów – faktycznie – dla początkujących (czytaj: zadania, z którymi przeciętny użytkownik PowerShella powinien sobie poradzić w jednej linii kodu). Kategoria dla zaawansowanych, moim skromnym zdaniem, nadaje się dla wszystkich, którzy już z PowerShellem jakiś czas pracują. Oczywiście, mogą się wtedy trafić konkurencje, w których nie uda się znaleźć rozwiązania – ale przynajmniej będzie satysfakcja, gdy jednak zadanie rozwiązać się uda.

Zadań w obu kategoriach będzie 10. Będą one ogłaszane każdego dnia roboczego przez dwa tygodnie. Na każde z zadań przeznaczony jest tydzień, więc okresy przeznaczone na wykonanie poszczególnych zadań nachodzą na siebie. Wszystkie skrypty należy umieszczać na specjalnie do tego celu przygotowanej stronie w ramach poshcode.org (prawdopodobny adres: 2012sg.poshcode.org). Skryptu raz umieszczonego nie da się modyfikować. Nie da się też wysłać kilku skryptów w ramach jednej kategorii. Dobrze jest więc kilka razy przetestować skrypt, zanim go umieścimy na stronie. Skrypty innych uczestników możemy zobaczyć dopiero wtedy, gdy skończy się okres przeznaczony na ich umieszczanie – nie można więc wrzucać cudzych skryptów jako własne.

Do udziału zachęcam wszystkich – trzeba naturalnie poświęcić nieco czasu, by “sklecić” skrypt, ale ryzykujecie w zasadzie niewiele:

  • szarpanie ego, gdy ktoś zbeszta Was za użycie write-host, lub coś równie “niehigienicznego”
  • czas, który moglibyście spędzić na czymś przyjemniejszym
  • … więcej grzechów nie pamiętam

Co możecie zyskać?

  • wiedzę
  • kilka skryptów, które być może uda się (po drobnych modyfikacjach) użyć w pracy – i piszę to z autopsji
  • wiedzę
  • radość z konkurowania z innymi
  • nagrody (zarówno za osiągnięcia, jak i losowe, za sam udział)
  • wiedzę
  • informację zwrotną o Waszych skryptach, zarówno od sędziów, jak i innych osób (komentarze będzie mógł do skryptów dodawać każdy)

Jak widać bilans zysków i strat wypada dość jednostronnie. Winking smile

Osobiście nie mogę się doczekać początku Scripting Games (2-go kwietnia 2012). Tym razem “przeskoczyłem” na drugą stronę ogrodzenia i nie będę uczestniczył, tylko oceniał. Smile W zeszłym roku, gdy drepcząc nerwowo w miejscu oczekiwał na ostateczny wynik, spędziłem nieco czasu komentując skrypty napisane przez innych, dlatego też cieszę się na tę zamianę ról. Dodatkowo nie ryzykuję detronizacji. Winking smile Choć to akurat nie było aż tak istotne. Czas oddać wspólnocie to, z czego sam czerpałem garściami przez ostatnie dwa lata…

Na koniec kilka linków:

2012 Windows PowerShell Scripting Games: All Links on One Page – strona, która należy dodać do ulubionych i na której będzie można odnaleźć wszystko to, co istotne

Grab the 2012 Scripting Games Badge! – stąd możecie pobrać “Dr Scripto” i ozdobić nim (kwestia gustu…) swój blog, kierując ludzi do w/w strony. Jak widać ja już to zrobiłem.

2012 Scripting Games Study Guide: A Resource for Learning PowerShell – tu znajdziecie informacje o tym, jaką wiedzę dobrze jest przyswoić przed rozpoczęciem Scripting Games, by później “trzaskać” zadania bez większego wysiłku. Zwykle wymienione tam bloki tematyczne znajdują później swoje odzwierciedlenie w zlecanych zadaniach.

Jeśli macie jakieś dodatkowe pytania – chętnie odpowiem, lub przekażę pytanie organizatorowi konkursu. Od 2 kwietnia zaczynam wypatrywać Waszych skryptów. Winking smile

Drugi! :)

•8 lutego, 2012 • 2 Komentarze

Wczoraj nastąpiło rozstrzygnięcie konkursu WGUiSW Idol. I nie powiem, miło mnie zaskoczyły jego wyniki. Oczywiście, pochlebne opinie mojej żony i mojego mentora “na gorąco” pozwalały wierzyć, że uzyskam jakąś dobrą notę, ale nawet wtedy nie sądziłem, że będzie ona aż tak wysoka (jeśli dobrze zarejestrowałem uzyskałem 8.25/10). Tym bardziej nie sądziłem, że do ostatniej chwili będę miał szansę na zwycięstwo. Naturalnie: bycie drugim ma też swoje minusy (świadomość, że zwycięstwo było tak blisko a jednak się nie udało). Na szczęście, widziałem tę szansę tylko przez dłuuuuuugie (subiektywnie długie, zgodnie z zasadą dotyczącą drzwi od toalety… Puszczam oczko )minuty po ogłoszeniu miejsca trzeciego i przed ogłoszeniem miejsca drugiego. Dla mnie to była cała wieczność, zwłaszcza że nagroda główna była nie-w-kij-dmuchał. Puszczam oczko

Z tego miejsca chciałem pogratulować zwycięzcy. Niestety, najlepszej sesji nie widziałem, czego żałuję z dwóch powodów: po pierwsze – musiało być świetnie (9.15… robi wrażenie). Po drugie, sesja dotyczyła PowerShella (jak ja mogłem przeoczyć to spotkanie, jak ja mogłem przeoczyć to spotkanie!). Na szczęście – dzięki nagrodzie głównej, będzie jeszcze okazja by sesji tej (w dodatku rozszerzonej) wysłuchać w całości na MCL-u. Uśmiech

Chciałbym też podziękować organizatorom i mentorom: świetny pomysł i zachęcam każdego do udziału. Nawet jeśli nie uda się wygrać (a tego wykluczyć nie możecie), to i tak warto się sprawdzić w roli prelegenta. Dodatkowo możliwość skonsultowania swoich pomysłów z kimś, kto ma w sesjach tego typu ma dużo większe doświadczenie, możliwość skorzystania z rad takiej osoby – bezcenna. Sam nie spodziewałem się, że tak mi się rola prelegenta spodoba. Więc jeśli macie coś do powiedzenia – zachęcam do udziału w kolejnej edycji. Paweł zapowiedział ją w podobny terminie (jesień 2012 – zima 2013).

A po samym konkursie pozostaną mi miłe wspomnienia, doświadczenia i kolejne trofeum do postawienia na półkę (już na niej stoi, obok nagrody MVP i statuetki Dr. Scripto:

IMG_0302