PowerShell相対パスで指定したフォルダを除外したファイル群の処理2/2

Windows に標準搭載されている、マイクロソフトが開発した .NET フレームワークが利用できるオブジェクト指向のコマンドラインインタプリタ (CLI) PowerShell で、配列に指定した相対パスのフォルダのファイルを除外して、存在する拡張子を表示するプログラム例実行結果を紹介します。

PowerShell 相対パスで指定したフォルダを除外したファイル群の処理1

※ Windows PowerShell 5.1.19041.5965 を使用します。
※プログラムは自己責任でご利用ください。

Part1 の記事

前回の Part1 の記事は以下です。

メイン処理の Where-Object による指定フォルダの除外

    Where-Object {
        $_.FullName -notmatch '\\\.git\\' -and
        -not (IsExcluded $_.DirectoryName $excludeDirs) -and
        $_.Extension -ne '' -and
        $_.Extension -notin $excludeExtensions
    } |

メイン処理に追加した行では、作成した IsExcluded 関数に、位置指定パラメータとして、カレントディレクトリの持つ各ファイル情報 (FileInfo) オブジェクトのディレクトリ名 (DirectoryName) と、除外する絶対パスのフォルダパスの文字列群の配列を格納した $excludeDirs 変数を渡して、ディレクトリが、除外するディレクトリ(またはその下位のディレクトリ)であるかを判定します。

  • 除外するディレクトリまたは下位のディレクトリだった場合は、そのディレクトリの絶対パスの文字列オブジェクトが、
  • 除外するディレクトリまたはサブディレクトリではまったくない場合$null が、

戻り値として返ってきます。
true, false の真偽値で評価する場合 $null は false で、オブジェクトが1個以上ある $null 以外は true です。

この結果を -Not パラメータを用いることで反転して、

  • 除外するディレクトリまたは下位のディレクトリだった場合false と評価し、
  • 除外するディレクトリまたは下位のディレクトリではまったくない場合true と評価

します。

-Not

プロパティが存在しない場合、または値が $null または $falseの場合、このコマンドレットがオブジェクトを取得することを示します。

Where-Object (Microsoft.PowerShell.Core) – PowerShell | Microsoft Learn

これにより、 Where-Object コマンドレットでは、除外するディレクトリまたは下位のディレクトリだった場合は、-Not で判定した false の結果となるため、それ以降の処理にそのディレクトリパスを持つオブジェクトを渡さず次のファイル情報 (FileInfo) オブジェクト処理に移ります。

実行結果

以下は、パート1でも紹介した「指定されたディレクトリ以下のパスを除外する」機能を追加したプログラムです。

# 除外するフォルダ、拡張子を指定します。
$excludeDirsRelative = @('./output', './build')  # 相対パスで指定
$excludeExtensions = @('.dll', '.fnt')  # 拡張子の除外リスト

# フォルダパス $dir は、除外するフォルダパスのリスト $excludeDirs に含まれているか確認します。
function IsExcluded($dir, $excludeDirs) {
    $fullPath = [System.IO.Path]::GetFullPath($dir)
    return $excludeDirs | Where-Object { $fullPath -like "$_*" }
}

#-relativePaths パラメータに割り当てた配列の全ての相対パスを絶対パスに変換した配列を返します。
# 変換に失敗したパスは返り値の配列に含まれません。
function DirsRelativeToAbsolute {
    param (
        [string[]]$relativePaths
    )
    return $relativePaths | ForEach-Object {
        try {
            [System.IO.Path]::GetFullPath((Resolve-Path -LiteralPath $_).ProviderPath)
        } catch {
            Write-Warning "除外対象のパス '$_' が見つかりませんでした。スキップします。"
            $null
        }
    } | Where-Object { $_ -ne $null }
}

# $excludeDirsRelative で指定された除外するフォルダパスを上記関数で絶対パスに変換して格納します。
$excludeDirs = DirsRelativeToAbsolute -relativePaths $excludeDirsRelative

# 除外するフォルダ、拡張子を除いた、カレントディレクトリ以下に含まれる拡張子を表示します。
Get-ChildItem -Recurse -File -Force |
    Where-Object {
        $_.FullName -notmatch '\\\.git\\' -and
        -not (IsExcluded $_.DirectoryName $excludeDirs) -and
        $_.Extension -ne '' -and
        $_.Extension -notin $excludeExtensions
    } |
    Select-Object -ExpandProperty Extension |
    ForEach-Object { $_.TrimStart('.') } |
    Sort-Object -Unique |
    ForEach-Object { Write-Host "*.$_" }

上記のプログラムで、除外したディレクトリ内のファイル処理を行っていないことを確認するため、

カレントディレクトリ直下の output フォルダだけに.wasm、 .hogehoge という拡張子があるフォルダを用いて、.wasm, .hogehoge 拡張子が表示されないことを確認します。

PowerShell 相対パスで指定したフォルダを除外したファイル群の処理3

また、同じ output という名前のフォルダですが tmp/output と別のパスの、除外していない output フォルダだけにある .piyopiyo という拡張子は、表示されることを確認します。

PowerShell 相対パスで指定したフォルダを除外したファイル群の処理2

カレントディレクトリに tmp/output の1つ上のディレクトリにした Windows PowerShell アプリにプログラムを貼り付けて、 Enter キー実行すると、リスト $excludeDirsRelative で除外したカレントディレクトリ直下の output フォルダ内の .wasm や .hogehoge は表示されず、同じフォルダ名ですが、異なるパスである tmp/output フォルダ内の .piyopiyo は表示されました。

PowerShell 相対パスで指定したフォルダを除外したファイル群の処理1
PS G:\Dev\Godot4GD\SakuraCrowd\SakuraCrowdGodotLib> # 除外するフォルダ、拡張子を指定します。
>> $excludeDirsRelative = @('./output', './build')  # 相対パスで指定
>> $excludeExtensions = @('.dll', '.fnt')  # 拡張子の除外リスト
>>
>> # フォルダパス $dir は、除外するフォルダパスのリスト $excludeDirs に含まれているか確認します。
>> function IsExcluded($dir, $excludeDirs) {
>>     $fullPath = [System.IO.Path]::GetFullPath($dir)
>>     return $excludeDirs | Where-Object { $fullPath -like "$_*" }
>> }
>>
>> #-relativePaths パラメータに割り当てた配列の全ての相対パスを絶対パスに変換した配列を返します。
>> # 変換に失敗したパスは返り値の配列に含まれません。
>> function DirsRelativeToAbsolute {
>>     param (
>>         [string[]]$relativePaths
>>     )
>>     return $relativePaths | ForEach-Object {
>>         try {
>>             [System.IO.Path]::GetFullPath((Resolve-Path -LiteralPath $_).ProviderPath)
>>         } catch {
>>             Write-Warning "除外対象のパス '$_' が見つかりませんでした。スキップします。"
>>             $null
>>         }
>>     } | Where-Object { $_ -ne $null }
>> }
>>
>> # $excludeDirsRelative で指定された除外するフォルダパスを上記関数で絶対パスに変換して格納します。
>> $excludeDirs = DirsRelativeToAbsolute -relativePaths $excludeDirsRelative
>>
>> # 除外するフォルダ、拡張子を除いた、カレントディレクトリ以下に含まれる拡張子を表示します。
>> Get-ChildItem -Recurse -File -Force |
>>     Where-Object {
>>         $_.FullName -notmatch '\\\.git\\' -and
>>         -not (IsExcluded $_.DirectoryName $excludeDirs) -and
>>         $_.Extension -ne '' -and
>>         $_.Extension -notin $excludeExtensions
>>     } |
>>     Select-Object -ExpandProperty Extension |
>>     ForEach-Object { $_.TrimStart('.') } |
>>     Sort-Object -Unique |
>>     ForEach-Object { Write-Host "*.$_" }
*.bin
*.cache
*.cfg
*.ctex
*.dylib
*.exp
*.fontdata
*.gd
*.gdextension
*.gdignore
*.gitattributes
*.gitignore
*.godot
*.import
*.lib
*.md
*.md5
*.Node
*.Object
*.piyopiyo
*.png
*.res
*.Resource
*.scn
*.so
*.svg
*.TMP
*.tres
*.tscn
*.ttf
*.txt

出力結果の *. が不要な場合の変更方法

拡張子の前の *. が不要な場合は、プログラムの最後の行の

ForEach-Object { Write-Host "*.$_" }s

ForEach-Object { Write-Host "$_" }

に変更してください。

まとめ

全2話で、Windows に標準搭載されている、マイクロソフトが開発した .NET フレームワークが利用できるオブジェクト指向のコマンドラインインタプリタ (CLI) PowerShell で、配列に指定した相対パスのフォルダのファイルを除外して、存在する拡張子を表示するプログラム例実行結果を紹介しました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました