Zobrazují se příspěvky se štítkem-Path. Zobrazit všechny příspěvky
Zobrazují se příspěvky se štítkem-Path. 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.

středa 29. dubna 2009

Hej, mistře Šelíku!

V jednom ze starších vydání mistra Skriptíka padl následující dotaz: "V přihlašovacím skritpu potřebuji ověřit existenci souboru. Víš, jak na to?" Odpověď byla následující: "Jedna možnost je použít objekt FileSystem a metodu FileExists."

Pokud chcete řešení v PowerShellu, mohu doporučit přímo cmdlet Test-Path. Více o něm v dřívějším článku.
V případě, že chcete použít .NET, existuje třída System.IO.File a obsahuje metodu Exists. Použití je následující:

PS c:\> [System.IO.File]::Exists("c:\config.sys")
True

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\)