Get-ChildItem
の-Exclude
パラメーターは、アイテムのパスではなく名前のみが対象だったと思うので、指定したディレクトリ以下を除外することはできません。
簡単な解決策はWhere-Object
を使ってアイテムのFullName
プロパティを対象にフィルタリングすることです。
PowerShell
1Get-ChildItem $parent_folder -File -Recurse | Where-Object FullName -NotLike *\Online*
追記:
もし指定フォルダのパスに除外フォルダと同名のフォルダが含まれている場合は以下のようにするとうまくいくかと思います。($parent_folder
はフルパスだと仮定します。)
PowerShell
1Get-ChildItem $parent_folder -File -Recurse | Where-Object FullName -notlike "$parent_folder*\Online*"
この方法は一旦除外フォルダ以下のアイテムも全て拾った後にフィルタリングします。
よって、除外フォルダ以下に大量のファイルがある場合は、無駄な処理が多くなりパフォーマンスが悪くなることが欠点です。
効率よく指定フォルダ以下を除外するには再帰的にファイルを拾っていく処理を自分で書く必要があるかと思います。
以下は一例です。
PowerShell
1function lsx ([string]$Path = ".", [string[]]$ExcludeDir) {
2
3 $stack = [Collections.Generic.Stack[object]]::new(@($Path))
4 $temp = [Collections.Generic.List[object]]::new()
5 $getChildItem = $ExecutionContext.InvokeProvider.ChildItem.Get
6
7 while ($stack.Count) {
8 $temp.Clear()
9 foreach ($item in $getChildItem.Invoke($stack.Pop(), $false, $false, $true)) {
10 if ($item.PSIsContainer) { if ($item.PSChildName -notin $ExcludeDir) { $temp.Add($item.PSPath) } }
11 else { $item }
12 }
13 foreach ($dir in $temp[($temp.Count - 1)..0]) { $stack.Push($dir) }
14 }
15}
使い方は以下です。
PowerShell
1lsx $parent_folder -Exclude "hoge","fuga"
この例では複数の除外フォルダ名を指定できます。ワイルドカード指定はできません。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/23 08:44 編集