Keresés a szkriptek között (Search-Script)

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



Word To HTML Converter