Zobrazují se příspěvky se štítkemcmdlet. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkemcmdlet. Zobrazit všechny příspěvky

pondělí 11. ledna 2010

Hrátky s parametry

[EN: Autotranslation]

Dnes jsem si hrál s modulem PSRemoteRegistry od Shaye Levyho. Testoval jsem různé parametry a napadlo mě, vypsat si tabulku, kde v řádkách budou vylistované funkce a ve sloupcích jednotlivé parametry. Vznikl mi následující výtvor:



Poté mě napadlo udělat malou statistiku pro standardní cmdlety. Nevím, jestli je to užitečné, ale já jsem se při tvorbě skriptu i výsledků dobře bavil :)

  • Počet cmdletů v modulech Microsoft.*: 236
  • Počet parametrů použitých v těchto cmdletech: 449
  • Počet kombinací cmdlet/parametr: 3491
  • Parametry, které jsou dostupné pro každý cmdlet: Zde určitě nikoho nepřekvapí (pokud ano, Get-Help about_CommonParameters je váš přítel pro následujících 10 minut :), že jsou to takzvané Common Parameters: Verbose, Debug, WarningAction, WarningVariable, ErrorAction, ErrorVariable, OutVariable, OutBuffer. Vyskytují se - ano, hádáte správně - 236x.
  • Další v pořadí jsou: Confirm, WhatIf (85), Force (68), Name (67), InputObject, Credential (54), Path (52). Ostatní parametry se vyskytují méně než 50x.
  • Parametrů, které se vyskytují pouze u jednoho cmdletu je 270.
  • Cmdlet s největším počtem parametrů: New-ModuleManifest (38)
  • Další v pořadí: Invoke-Command (28), New-PSSessionOption (28), Get-WSManInstance (28), Get-WmiObject (26), Set-WmiInstance, Invoke-WmiMethod (25).
  • Nejméně parametrů: Get-Culture, Get-Transaction, Get-Host, Get-PSCallStack, Get-UICulture, Exit-PSSession, Stop-Transcript, Get-WSManCredSSP (8).
Určitě bych mohl pokračovat dále, ale myslím, že tohle pro přehled stačí. Pokud chcete dělat vlastní výzkumy, zde je kód:




  1. function Get-CommandParameter {   

  2.   

  3.     param (   

  4.         [Parameter(   

  5.             ValueFromPipeline=$true,   

  6.             ValueFromPipelineByPropertyName=$true  

  7.         )]         

  8.         [string[]]$Name=""  

  9.     )   

  10.        

  11.     PROCESS {   

  12.            

  13.         foreach ($c in $Name) {   

  14.   

  15.             # receive all parameters   

  16.             $cParams = (Get-Command $c).Parameters.Keys   

  17.                

  18.             # process every parameter and create object   

  19.             foreach ($p in $cParams) {   

  20.            

  21.                 $psObj = New-Object PSObject -Property @{   

  22.                     Command=$c  

  23.                     Parameter=$p  

  24.                 } # psObj        

  25.                    

  26.                 $psObj         

  27.             } # foreach $p   

  28.         } # foreach $c     

  29.     } # PROCESS   

  30. # function Get-CommandParameter  


Použití je poté následující:
PS C:\> $a = Get-Command -CommandType cmdlet Get-CommandParameter
PS C:\> $a.Count
3491

středa 24. prosince 2008

Práce s cestou: *-Path

Pokud pracujete v PowerShellu s cestami mohou se vám hodit cmdlety z dnešního článku. Popsané techniky fungují jak pro práci se soubory/adresáři, tak i pro práci v registrech (s jistými omezeními).

Test-Path slouží k otestování existence cesty. Nejčastěji se používá pro test existence určitého souboru.

PS C:\> Test-Path C:\CONFIG.SYS
True
PS C:\> Test-Path $PROFILE
True
PS C:\> Test-Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
True
PS C:\> Test-Path HKLM:\SOFTWARE\Microsoft\PowerShell\1\PowerShellEngine\PowerShellVersion
False


V posledním případě je vidět, že práci s registry nám trochu komplikuje přístup PowerShellu k provideru registru. Funguje na úrovni klíčů a nikoli hodnot.

Convert-Path převede např. proměnné prostředí na reálnou cestu. Čili:

PS C:\> Convert-Path ~
C:\Documents and Settings\moravec
PS C:\> Convert-Path $env:TEMP
C:\WINDOWS\TEMP


Split-Path slouží k rozdělění cesty na její části, zjednodušeně řečeno na adresář a soubor. Bez uvedení parametrů vrátí rodičovský adresář.

PS C:\> Split-Path $env:temp
C:\WINDOWS

Pokud chcete naopak poslední část cesty, použijte parametr Leaf.

PS C:\> Split-Path $env:temp -Leaf
TEMP
PS C:\> Split-Path $PROFILE -Leaf
Microsoft.PowerShell_profile.ps1

Chcete-li získat root testované cesty použijte parametr Qualifier (případně NoQualifier, pokud chcete získat cestu bez rootu).

PS C:\> Split-Path $PROFILE -Qualifier
C:
PS C:\> Split-Path $PROFILE -NoQualifier
\Documents and Settings\moravec\My Documents\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
PS C:\> Split-Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion -Qualifier
HKLM:

Resolve-Path se používá v případě, že chceme získat cestu zapsanou zástupnými znaky. Porovnejte následující výstupy:

PS C:\> Resolve-Path ~
Path
----

C:\Documents and Settings\moravec
PS C:\> Convert-Path ~
C:\Documents and Settings\moravec

Na první pohled je vidět, že výstupem Resolve-Path bude asi něco zajímavějšího než jen čistý text. Je to tak - Convert-Path vrací řetězec, Resolve-Path naproti tomu vrací objekt typu System.Management.Automation.PathInfo. Tento objekt má několik vlastností.

PS C:\> Resolve-Path ~ | fl *

Drive : C
Provider : Microsoft.PowerShell.Core\FileSystem
ProviderPath : C:\Documents and Settings\moravec
Path : C:\Documents and Settings\moravec


Join-Path je posledním z "cestovních" příkazů. Používá se k tvorbě cesty. Chcete-li v adresáři, kde je uložen profil, vytvořit adresář pro vaše skripty, je jednou z cest následující příkaz:

PS C:\> mkdir (join-path (split-path $profile) \skripty\)

pondělí 24. listopadu 2008

Použití Write-Progress

Na školení PowerShellu se jeden z kolegů ptal, jak udělal /\/\o\/\/ progress bar při instalaci PowerTab. Pro ty z vás, co jej neznají (myslím progress bar :) - jedná se o tento pruh



který je umístěn v horní části okna PowerShellu. Při delším načítání (zapisování, kopírování, ...) dat je to vhodná pomůcka pro uživatele. V každém okamžiku ví, kde přesně se v čase nachází. Abyste nemuseli něco takového sami vymýšlet, je přímo v PowerShellu cmdlet Write-Progress. Pojďme se podívat, jak funguje.

Write-Progress má dva povinné parametry:
  • activity - řetězec, který říká, jaká aktivita probíhá (na obrázku výše je to Loading records ...)
  • status - popisuje konkrétní (aktuální) stav aktivity; v našem případě 136 of 633.
Pokud použijete pouze tyto dva parametry, můžete vyzkoušet jednoduché zobrazení hodnoty čítače (aby bylo něco vidět, přidal jsem čekání 100ms před každou změnou)

for($i=0; $i -le 50; $i++) {
Start-Sleep -m 100
Write-Progress "Ukazuji promennou..." $i }

Výsledkem je následují výstup


Takovýto základní ukazatel nám asi ve většině případů nebude stačit. Je dobré dát uživateli vědět, jak dlouho bude ještě čekat na dokončení operace. K tomu slouží další dva parametry (musí se uvádět jejich jméno)
  • percentComplete - ukazuje formou "teploměru", kolik procent je již hotovo (viz úplně první obrázek)
  • secondsRemaining - počet vteřin do skončení operace
Ukažme si jednoduchý příklad použití druhého parametru

for($i=0; $i -le 10; $i++) {
Start-Sleep 1
$sec = 10-$i
Write-Progress "Ukazuji promennou..." $i -secondsRemaining $sec }

Ve smyčce for zvyšujeme hodnotu proměnné i do deseti a zároveň zobrazujeme počet vteřin zbývajících do konce operace.


Pro úplné popsání Write-Progress nám ještě chybí následující parametry
  • id - specifikuje jedinečné ID progress baru. Lze použít pro zpětné volání.
  • currentOperation - popisuje aktuální operaci. Je více specifický než status.
  • parentId - aktivita nadřazená té aktuální
  • completed - standardně false, pokud je true nezobrazuje se progress bar
  • sourceId - zdroj záznamu
Pokud chcete vidět nějaký smysluplný příklad stáhněte si zdrojové kódy ke knize Windows PowerShell: TFM a koukněte se na P093-InventoryProgress.ps1.

Write-Progress můžete ovládat několika následujícími parametry:
  • $ProgressPreference - může nabývat hodnot SilentlyContinue, Continue, Stop, Inquire. Pokud nastavíte SilentlyContinue, progress bar nebude vidět (stejné jako kdybyste pro každý nastavili -completed = $true).
  • $host.PrivateData.get_Progress*, $host.PrivateData.Progress* - nastavují/zobrazují barvu progress baru.

První obrázek v tomto článku vznikl, při načítání dat z databáze Lotus Notes. V současné době používám novější verzi, která navíc zobrazuje data načítaného záznamu

Write-Progress -Activity "Loading records..." -Status "$i of $DomNumOfDocs" -id 1 -CurrentOperation "$LNlastname" -PercentComplete ($i/$DomNumOfDocs*100)

pondělí 6. října 2008

Get-Command

Další cmdlet, který si ukážeme je Get-Command. Zpočátku jsem jej považoval za trochu jiný Get-Help, ale naštěstí jsem byl v relativně krátkém čase vyveden z omylu.

Použít jej můžete například pro zjišťování existujících cmdletů. Pokud víte, že chcete pracovat s objekty a neznáte všechny možnosti, použijte následující příkaz (výstup jsem trochu upravil pro potřeby zobrazení):

Get-Command *-object

CommandType Name Definition
----------- ---- ----------
Cmdlet Compare-Object Compare-Object...
Cmdlet ForEach-Object ForEach-Object...
Cmdlet Group-Object Group-Object [[...
Cmdlet Measure-Object Measure-Object...
Cmdlet New-Object New-Object [-Ty...
Cmdlet Select-Object Select-Object [...
Cmdlet Sort-Object Sort-Object [[-...
Cmdlet Tee-Object Tee-Object [-Fi...
Cmdlet Where-Object Where-Object [-...

Na výstupu dostanete všechny cmdlety, které slouží k práci s objekty a pokud se vám některý líbí, můžete na něj hned použít Get-Help.

Při práci s cmdlety je dobré vědět, jak vznikají jejich jména. Používá se forma nazvaná Verb-Noun (česky Sloveso-PodstatneJmeno). V první části názvu tedy říkáme co chceme dělat a ve druhé s čím chceme pracovat. I základní znalost angličtiny většinou stačí, aby člověk v krátké době začal používat tuto jmennou konvenci naprosto intuitivně. Pokud znáte verb-noun a víte, že PowerShell je objektový, můžete zkusit uhádnout výstup tohoto příkazu:

Get-Command -Noun Object

Nemělo by vás překvapit, že výstupem je stejný seznam jako v prvním případě. Existuje samozřejmě i přepínač -Verb. V nedávno uveřejněném článku, žádal Jeffrey Snover PS komunitu o dodržování pravidla verb-noun. Pokud budete vytvářet své cmdlety nebo skripty, snažte se v rámci "čitelnosti" toto pravidlo také dodržovat.

Get-Command slouží i ke zjištění informací o funkcích, aplikacích, skriptech, atd. Zajímá vás třeba ping, zadejte

Get-Command ping | Format-List

a dostanete výstup, ve kterém si můžete zjistit některé zajímavosti (verze, cesta, ...)

Na závěr si zkuste následující příkazy:

Get-Command
gcm
Get-Command *
Get-Command -Verb Get
Get-Command -CommandType Function


pondělí 15. září 2008

Get-Help

Naši pouť po cmdletech začneme u jednoho z nejpoužívanějších (doufejme :) - Get-Help. Každý z nás byl někdy více či méně nespokojen z jakoukoli Microsoftí nápovědou (když pomineme lidi, kteří nápovědu nečtou, což je asi většina). V PowerShellu je ovšem Get-Help na velice dobré úrovni a doporučujeme jej používat. Základní variantou je čistě uvedení cmdletu bez parametrů:

Get-Help

Tento příkaz vypíše základní informace, ze kterých můžeme dále vycházet. Zobrazíme je všechny a ukážeme si na nich práci s nápovědou v PowerShellu (barevně jsme odlišili jednotlivé sekce - o nich si více povíme za chvíli).

TOPIC
    Get-Help

SHORT DESCRIPTION
    Displays help about PowerShell cmdlets and concepts.

LONG DESCRIPTION

SYNTAX
    get-help {<CmdletName> | <TopicName>}
    help {<CmdletName> | <TopicName>}
    <CmdletName> -?

    "Get-help" and "-?" display help on one page.
    "Help" displays help on multiple pages.

    Examples:
      get-help get-process : Displays help about the get-process cmdlet.
      get-help about-signing : Displays help about the signing concept.
      help where-object : Displays help about the where-object cmdlet.
      help about_foreach : Displays help about foreach loops in PowerShell.
      match-string -? : Displays help about the match-string cmdlet.

    You can use wildcard characters in the help commands (not with -?).
    If multiple help topics match, PowerShell displays a list of matching
    topics. If only one help topic matches, PowerShell displays the topic.

    Examples:
      get-help * : Displays all help topics.
      get-help get-* : Displays topics that begin with get-.
      help *object* : Displays topics with "object" in the name.
      get-help about* : Displays all conceptual topics.

    For information about wildcards, type:
      get-help about_wildcard

REMARKS
    To learn about PowerShell, read the following help topics:
      get-command : Displays a list of cmdlets.
      about_object : Explains the use of objects in PowerShell.
      get-member : Displays the properties of an object.

    Conceptual help files are named "about_<topic>", such as:
      about_regular_expression.

    The help commands also display the aliases on the system.
    For information about aliases, type:

      get-help about_alias

Každý help v PowerShellu je rozdělen do sekcí, které jsou volány v závislosti na parametrech cmdletu Get-Help (-detailed, -full). Názvy sekcí jsou následující:

  • Name - jméno cmdletu
  • Synopsis - krátký popis cmdletu
  • Syntax - popis syntaxe
  • Detailed Description - podbobnější popis funkce cmdletu
  • Parameters - popis použítí všech parametrů
  • Input Type - typ objektů, které cmdlet očekává na vstupu
  • Return Type - typ výstupu
  • Examples - příklady použití cmdletu
  • Related Links - jména podobných cmdletů
  • Remarks - informace o použití parametrů

Při volání Get-Help -full nám Get-Help vrátí všechny výše popsané sekce. Pro vypsání všech informací o cmdletu Get-WmiObject, tedy zapíšeme


Get-Help Get-WmiObject -full

Další zajímavou části nápovědy v PowerShellu je tématická nápověda. Poznáte ji podle toho, že její jméno začíná slovem about. Například Get-Help about_regular_expression vyvolá nápovědu o používání regulárních výrazů.

Domácí úkol: Projděte si všechny příklady v Get-Help a zapamatujte si je pro další použití :)