質問するログイン新規登録

回答編集履歴

5

微修正

2019/07/23 10:33

投稿

mitarai
mitarai

スコア223

answer CHANGED
@@ -8,7 +8,7 @@
8
8
  ---
9
9
  追記:
10
10
 
11
- 指定フォルダのパスに除外フォルダと同名のフォルダが含まれているということなので以下のようにするとうまくいくかと思います。(`$parent_folder`はフルパスだと仮定します。)
11
+ もし指定フォルダのパスに除外フォルダと同名のフォルダが含まれている場合は以下のようにするとうまくいくかと思います。(`$parent_folder`はフルパスだと仮定します。)
12
12
 
13
13
  ```PowerShell
14
14
  Get-ChildItem $parent_folder -File -Recurse | Where-Object FullName -notlike "$parent_folder*\Online*"

4

微修正

2019/07/23 10:33

投稿

mitarai
mitarai

スコア223

answer CHANGED
@@ -11,7 +11,7 @@
11
11
  指定フォルダのパスに除外フォルダと同名のフォルダが含まれているということなので以下のようにするとうまくいくかと思います。(`$parent_folder`はフルパスだと仮定します。)
12
12
 
13
13
  ```PowerShell
14
- Get-ChildItem $parent_folder -File -Recurse | Where-Object FullName -notlike "$parent_folder*\Online*"
14
+ Get-ChildItem $parent_folder -File -Recurse | Where-Object FullName -notlike "$parent_folder*\Online*"
15
15
  ```
16
16
  ---
17
17
 
@@ -41,4 +41,4 @@
41
41
  ```PowerShell
42
42
  lsx $parent_folder -Exclude "hoge","fuga"
43
43
  ```
44
- 複数の除外フォルダ名を指定できます。この例ではワイルドカード指定はできません。
44
+ この例では複数の除外フォルダ名を指定できます。ワイルドカード指定はできません。

3

指定パスに除外フォルダ名が含まれている場合の追記

2019/07/23 10:30

投稿

mitarai
mitarai

スコア223

answer CHANGED
@@ -3,9 +3,18 @@
3
3
  簡単な解決策は`Where-Object`を使ってアイテムの`FullName`プロパティを対象にフィルタリングすることです。
4
4
 
5
5
  ```PowerShell
6
- Get-ChildItem -File -Recurse | Where-Object FullName -NotLike *\Online*
6
+ Get-ChildItem $parent_folder -File -Recurse | Where-Object FullName -NotLike *\Online*
7
7
  ```
8
+ ---
9
+ 追記:
8
10
 
11
+ 指定フォルダのパスに除外フォルダと同名のフォルダが含まれているということなので以下のようにするとうまくいくかと思います。(`$parent_folder`はフルパスだと仮定します。)
12
+
13
+ ```PowerShell
14
+ Get-ChildItem $parent_folder -File -Recurse | Where-Object FullName -notlike "$parent_folder*\Online*"
15
+ ```
16
+ ---
17
+
9
18
  この方法は一旦除外フォルダ以下のアイテムも全て拾った後にフィルタリングします。
10
19
  よって、除外フォルダ以下に大量のファイルがある場合は、無駄な処理が多くなりパフォーマンスが悪くなることが欠点です。
11
20
 

2

若干の高速化

2019/07/23 10:29

投稿

mitarai
mitarai

スコア223

answer CHANGED
@@ -3,7 +3,7 @@
3
3
  簡単な解決策は`Where-Object`を使ってアイテムの`FullName`プロパティを対象にフィルタリングすることです。
4
4
 
5
5
  ```PowerShell
6
- Get-ChildItem -File -Recurse | Where-Object FullName -NotLike *\b*
6
+ Get-ChildItem -File -Recurse | Where-Object FullName -NotLike *\Online*
7
7
  ```
8
8
 
9
9
  この方法は一旦除外フォルダ以下のアイテムも全て拾った後にフィルタリングします。
@@ -16,10 +16,11 @@
16
16
 
17
17
  $stack = [Collections.Generic.Stack[object]]::new(@($Path))
18
18
  $temp = [Collections.Generic.List[object]]::new()
19
+ $getChildItem = $ExecutionContext.InvokeProvider.ChildItem.Get
19
20
 
20
21
  while ($stack.Count) {
21
22
  $temp.Clear()
22
- foreach ($item in Get-ChildItem -LiteralPath $stack.Pop()) {
23
+ foreach ($item in $getChildItem.Invoke($stack.Pop(), $false, $false, $true)) {
23
24
  if ($item.PSIsContainer) { if ($item.PSChildName -notin $ExcludeDir) { $temp.Add($item.PSPath) } }
24
25
  else { $item }
25
26
  }

1

微修正

2019/07/23 09:37

投稿

mitarai
mitarai

スコア223

answer CHANGED
@@ -20,7 +20,7 @@
20
20
  while ($stack.Count) {
21
21
  $temp.Clear()
22
22
  foreach ($item in Get-ChildItem -LiteralPath $stack.Pop()) {
23
- if ($item.PSIsContainer) { if ($item.Name -notin $ExcludeDir) { $temp.Add($item.PSPath) } }
23
+ if ($item.PSIsContainer) { if ($item.PSChildName -notin $ExcludeDir) { $temp.Add($item.PSPath) } }
24
24
  else { $item }
25
25
  }
26
26
  foreach ($dir in $temp[($temp.Count - 1)..0]) { $stack.Push($dir) }