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

※ 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
プロパティが存在しない場合、または値が
Where-Object (Microsoft.PowerShell.Core) – PowerShell | Microsoft Learn$null
または$false
の場合、このコマンドレットがオブジェクトを取得することを示します。
これにより、 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 拡張子が表示されないことを確認します。

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

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

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!
- Git
- Git – gitattributes Documentation
- PowerShell とは – PowerShell | Microsoft Learn
- Where-Object (Microsoft.PowerShell.Core) – PowerShell | Microsoft Learn
- Path.GetFullPath メソッド (System.IO) | Microsoft Learn
- about_Functions_Advanced_Parameters – PowerShell | Microsoft Learn
- コマンドレット パラメーターの種類 – PowerShell | Microsoft Learn
- about_Try_Catch_Finally – PowerShell | Microsoft Learn
- $nullについて知りたいこと – PowerShell | Microsoft Learn
- FileInfo クラス (System.IO) | Microsoft Learn
記事一覧 → Compota-Soft-Press
コメント