Zobrazují se příspěvky se štítkemzajímavé skripty. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemzajímavé skripty. Zobrazit všechny příspěvky

středa 20. května 2009

Hledání adresářů podle obsahu

Jedna z poznámek na Twitteru mě zavedla ke konzoli PowerShellu. Chtěl jsem si vyzkoušet, jak je jednoduché vyhledat adresáře podle specifického zadání. Konkrétní dotaz zněl: "Chci všechny adresáře začínající písmenem L, které obsahují soubory *.dwg". Dotaz jsem si upravil na "... všechny soubory s příponou PS1, které jsou v adresáři začínajícím na zzz.

Vypadl mi následující one-liner:

ls -i *.ps1 -r | select Directory -u | % {if((Split-Path $_.Directory -le) -like 'zzz*') {$_}}

Lépe je zřejmě čitelný takto:

Get-ChildItem -Include *.ps1 -Recurse | `
Select-Object -Property Directory -Unique |`
ForEach-Object {
if ( (Split-Path $_.Directory -Leaf) -like 'zzz*') { $_ }
}

V první části roury probíhá rekurzivní hledání všech PS1 souborů. Poté vybereme jména všech adresárů a dále hledáme ty, jejichž jméno začíná na zzz. pokud některý podmínku splňuje, tak vypíšeme celou cestu k adresáři.

pondělí 9. března 2009

Looking for HResult

In one of the last Hey, Scripting Guy! article is described how to install updates and check it's result codes. I was really surprised when Scripting guys told me: "We can use calc.exe" - OMG why not use converting directly in PowerShell?

PS C:\> "0x{0:x}" -f [int] -2145124318
0x80240022

When I tried this I start thinking about the function which will do the conversion and shows also description of the result code.

  1. # Name : Get-HResult.ps1
  2. # Author: David "Makovec" Moravec
  3. # Web : http://www.powershell.cz
  4. # Email : powershell.cz@googlemail.com
  5. #
  6. # Description: Finds meaning of HResult
  7. #
  8. # Version: 0.1
  9. # History:
  10. # v0.1 - (add) basic functionality
  11. #
  12. # Usage: Get-HResult -2145124318
  13. #
  14. #################################################################
  15. function Get-HResult {
  16. param (
  17. $HResult,
  18. $url = 'http://technet.microsoft.com/en-us/library/cc720442.aspx'
  19. )
  20. $calc = "0x{0:x}" -f [int]$HResult
  21. $lookFor = $calc+'.*?tr'
  22. $wc = New-Object system.net.webclient
  23. $wc.DownloadString($url) -match $lookFor | Out-Null
  24. $tmp = $matches[0]
  25. $searchString = '(?<ResCode>'+$calc+').*\<p\>(?<ResStr>.+?)\<.*\<p\>(?<Description>.+?)\</p.+'
  26. $tmp -match $searchString | Out-Null
  27. Write-Host "HResult: " $HResult
  28. Write-Host "Result Code: " $matches.ResCode
  29. Write-Host "Result String: " $matches.ResStr
  30. Write-Host "Description: " $matches.Description
  31. } #function

By default script return results for Windows Update Agent and has no checking for errors. It has parameter for providing different URL but I didn't try any. Usage is following:

PS C:\> Get-HResult -2145124351
Result Code: 0x80240001
Result String: WU_E_NO_SERVICE
Description: Windows Update Agent was unable to provide the service.

Source code will be available at PoSh Code when I'll be able to open it, now have troubles with connectivity.

pátek 23. ledna 2009

Jak najít význam zkratky

Poslední dobou hodně komunikuji s lidmi, kteří tráví [četováním] evidentně hodně času i mimo práci. Používají množství zkratek, ze kterých jsem občas trochu mimo. Jelikož pak většinou nechápu odpovědi typu BFN, ACAB a podobně. Do nynějška jsem vždy použil Google a ne vždy se trefil napoprvé. Rozhodl jsem se vytvořit funkci, která vyhledá význam zkratky na internetu. Po vyzkoušení několika stránek se mi zalíbila (jak z hlediska vrácených odpovědí, tak i z hlediska struktury HTML stránky) stránka Acronyms and Abbreviations na TheFreeDictionary.

Vrácené HTML je ve tvaru, který je vidět na obrázku



Pomocí XPath jsem se dotázal na všechny druhé sloupce a výsledkem je seznam významů. Pro stažení a parsování výsledku hledání jsem použil Invoke-Http a Receive-Http z HttpRest. Použití je jednoduché:


PS C:\> Find-Abbreviation itmu
Inventory Tool for Microsoft Updates

  1. # Name : Find-Abbreviation.ps1
  2. # Author: David "Makovec" Moravec
  3. # Web : http://www.powershell.cz
  4. # Email : powershell.cz@googlemail.com
  5. #
  6. # Description: Finds meaning of given abbreviation
  7. # : Uses HttpRest http://poshcode.org/787
  8. #
  9. # Version: 0.1
  10. # History:
  11. # v0.1 - (add) basic functionality
  12. #
  13. # Usage: Find-Abbreviation fyi
  14. #
  15. #################################################################
  16. function Find-Abbreviation {
  17. $url = "http://acronyms.thefreedictionary.com/$args"
  18. Invoke-Http get $url | Receive-Http Text "//tr[@cat]//td[2]"
  19. }
Skript je ke stažení na PoshCode.

pátek 24. října 2008

Start-Demo

Před několika měsíci jsem v PowerShell blogu objevil moc pěkný skript, sloužící k provádění prezentací. Napsal ho Jeffrey Snover před jeho prezentací pro Billa Gatese a Raye Ozzieho. Skript byl od té doby vylepšen, poslední verze je z června 2007. Skript jsem viděl v akci již na několika konferencích u mnoha lidí a používám ho i pro své prezentace.

Výhodou je, že si předem připravíte všechny příkazy, které chcete obecenstvu ukázat a pak je pouštíte bez toho, abyste se museli bát, že uděláte překlep nebo něco nebude fungovat (i když generálský efekt funguje vždy a všude :) Vše funguje zhruba následovně:
  1. Připravíte si textový soubor, do kterého si na každý řádek napíšete jeden příkaz PowerShellu. Pokud spustíte Start-Demo bez parametru, použije obsah souboru demo.txt, pokud je v aktuálním adresáři. Máte-li jiné jméno souboru, zadejte ho jako parametr.
  2. Skript zobrazí první řádku a čeká na zmáčknutí klávesy Enter (případně na jinou "funkční" klávesu, viz dále). Máte tedy čas na vysvětlení příkazu.
  3. Příkaz je proveden, skript po jeho skončení čeká na další Enter a vy máte čas na popsání výpisu.
  4. Vše se poté opakuje až do konce obsahu vstupního souboru.
Skript za běhu vidíte na následujícím obrázku.

Na začátku každého řádku je vidět číslo příkazu, který je spouštěn. Dále vidíte v titulku okna dva údaje: délku běhu skriptu a aktuální příkaz. Již jsem se zmiňoval o "funkčních" klávesách. Můžete použít následující:
  • ? - zobrazí nápovědu, viz obrázek výše.
  • ! - vyskočí z prezentace do prostředí PowerShellu kde můžete provádět libovolný příkaz. Hodí se například v případě, že chcete reagovat na dotaz posluchačů. Zpátky se dostanete příkazem exit.
  • d - zobrazí obsah prezentovaného souboru včetně čísel řádek
  • #x - místo znaku # zadáte číslo příkazu, na který chcete skočit
  • fx - vypíše všechny řádky obsahující hledaný text, např. fGet
  • px - rychlost, kterou budou příkazy vypisovány na konzoli. Standardně je nastavena na 200ms.
  • b - vrací se o jeden příkaz zpět
  • s - přeskočí příkaz
  • t - kontrola času. Zobrazí čas trvání prezentace a pozici v prezentaci, např. pátá řádka z dvaceti.
  • q - ukončí prezentaci
Pokud chcete někomu ukázat možnosti PowerShellu, toto je skript, který mohu jen doporučit. Jeden tip na závěr: Nepoužívám defaultní jméno vstupního souboru (demo.txt), ale soubor s příponou ps1. Tím mám zaručeno, že při přípravě prezentace se mi soubor otevře v mém editoru a mohu využít jeho plné možnosti (např. zvýraznění syntaxe).