Elég sok szkriptem van szanaszéjjel, gyakran nem könnyű megtalálni azt, amit éppen keresek. A fájl nevére nem emlékszem, de egy jellegzetes cmdletre vagy függvénynévre igen, így tehát a szkriptben levő szöveg alapján kellene megtalálni azt.
Első verzióban a Search-Script1 függvénynek 2 paramétere van: $pattern – amit keresünk és $path – az a mappa, ahol keressük a fájlokat:
function Search-Script1 {
param(
[string] $pattern,
[string] $path
)
Get-ChildItem -Path $path -Filter *.ps1 -Recurse |
Select-String -Pattern $pattern |
Select-Object -Property Path, LineNumber, Line
}
A Select-String-et használom a függvényben, és ugyan van neki -path paramétere, de sajnos ‑recurse nincsen, így mégis a Get-ChildItem-mel kell magukat a fájlokat listázni. A kimenetet a Select-Object adja, a fájl elérési útja, a sornak a száma, ahol a minta megtalálható és maga a sor:
PS C:\> Search-Script1 -path C:\PSTools\ -pattern Initialize
Path LineNumber Line
---- ---------- ----
C:\PSTools\Section07-Video2-MainScript.ps1 9 Initialize-Logging -t...
C:\PSTools\Section08-Video1-testexit.ps1 19 Initialize-Logging -t...
C:\PSTools\Section08-Video2.ps1 3 Initialize-Logging -t...
C:\PSTools\Section08-Video3.ps1 3 Initialize-Logging -t...
A következő verzióba tegyünk 2 új paramétert: $extension, azoknak a kiterjesztéseknek a listája, amilyen fájlokban keresünk, és $exclude, azoknak a listája, amiben nem keresünk, ez utóbbinak akkor van szerepe, ha például valami nagyon megengedő mintát adunk az $extension-ben:
function Search-Script2 {
param(
[string] $pattern,
[string] $path,
[string[]] $extension = ("ps1", "psm1"),
[string[]] $exclude = "wxyz"
)
if($extension -ne "*"){
$include = $extension | ForEach-Object {$_ -replace "^(\*)?(\.)?","*." }
}
$exclude = $exclude | ForEach-Object {$_ -replace "^(\*)?(\.)?","*." }
Get-ChildItem -Path $path -Include $include -Exclude $exclude -Recurse |
Select-String -Pattern $pattern |
Select-Object -Property Path, LineNumber, Line
}
A függvényen belül az $include és az újra alkotott $exclude azt a célt szolgálja, hogy például akár *.ps1 vagy ps1-et is megadhassunk és a -replace mindkettőből *.ps1-et csinál. A Get-ChildItem-nél immár a -filter helyett az -include-ot használom, mivel a -filter csak egy szöveget fogad el, itt meg egy szövegtömböt is meg lehet adni. Mivel PowerShell-lel foglalkozunk, így az $extension alaphelyzetben ps1 és psm1, az $exclude-nak meg egy nemlétező wxyz-t adtam, hogy ne panaszkodjon a Get-ChildItem.
A végső verzióba még a kimenetbe berakom a fájl utolsó módosításának idejét és egy kapcsoló paramétert, a $SortByDate-et, hogy dátum szerint lehessen rendezni:
function Search-Script {
param(
[string] $pattern,
[string] $path,
[string[]] $extension = ("ps1", "psm1"),
[string[]] $exclude = "wxyz",
[switch] $SortByDate
)
if($extension -ne "*"){
$include = $extension | ForEach-Object {$_ -replace "^(\*)?(\.)?","*." }
}
$exclude = $exclude | ForEach-Object {$_ -replace "^(\*)?(\.)?","*." }
if(!$SortByDate){
$sortparam = "dummy"
}
else{
$sortparam = "LastWriteTime"
}
Get-ChildItem -Path $path -Include $include -Exclude $exclude -Recurse |
Select-String -Pattern $pattern |
Select-Object -Property Path, @{n="LastWriteTime"; e = {(get-item -Path $_.Path).LastWriteTime}}, LineNumber, Line |
Sort-Object -Property $sortparam
}
És használat közben:
PS C:\> Search-Script -pattern Init -path C:\PSTools -exclude psm1 -SortByDate
Path LastWriteTime LineNumber L
i
n
e
---- ------------- ---------- -
C:\PSTools\Section01-Video4.ps1 2022. 12. 16. 1:44:24 32 #
C:\PSTools\Section07-Video2-MainScript.ps1 2023. 01. 03. 13:15:19 9 I
C:\PSTools\Section08-Video1-testexit.ps1 2023. 01. 06. 19:53:29 19 I
C:\PSTools\Section08-Video2.ps1 2023. 01. 06. 20:26:05 3 I
C:\PSTools\Section09-Video1.ps1 2023. 01. 06. 21:03:03 3 I
C:\PSTools\Section08-Video3.ps1 2023. 01. 06. 21:03:03 3 I
C:\PSTools\Section09-Video2.ps1 2023. 01. 08. 23:27:00 3 I
C:\PSTools\Section09-Video3-2.ps1 2023. 01. 10. 19:08:31 30 I
C:\PSTools\Section09-Video3.ps1 2023. 01. 10. 19:20:39 24 I
(Itt a helyhiány miatt a Line kicsit rövidkére sikeredett, de jól működik a függvény.)