web-dev-qa-db-ja.com

PowerShellを使用した再帰的ファイル検索

すべてのフォルダでファイルを検索しています。

Copyforbuild.batは多くの場所で利用可能です、そして私は再帰的に検索したいです。

$File = "V:\Myfolder\**\*.CopyForbuild.bat"

PowerShellでそれを行うにはどうすればよいですか。

213
Samselvaprabu

-Recurseスイッチを指定して Get-ChildItem コマンドレットを使用します。

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
349
Shay Levy

セキュリティに基づいてエラーが発生する可能性があるフォルダ(例:C:\Users)を検索するときは、次のコマンドを使用します。

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
29
Mötz

これを使用してファイルを検索し、PowerShellに結果の完全なパスを表示させます。

dir -Path C:\FolderName -Filter FileName.fileExtension -Recurse | %{$_.FullName}

FolderName*には、いつでもワイルドカードFileName.fileExtensionを使用できます。例えば:

dir -Path C:\Folder* -Filter File*.file* -Recurse | %{$_.FullName}

上記の例は、WordのFolderで始まるC:\ドライブ内の任意のフォルダを検索します。 FolderFooFolderBarという名前のフォルダがある場合、PowerShellはそれら両方のフォルダからの結果を表示します。

ファイル名とファイル拡張子についても同様です。特定の拡張子を持つファイルを検索したいがファイルの名前がわからない場合は、次のようにします。

dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}

またはその逆

dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}
29
BinaryJoe01
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat

また働く

11
user3303020

これを試して:

Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
5
Sevenfold

ワイルドカードを使用してフィルタリングします。

Get-ChildItem -Filter CopyForBuild* -Include *.bat,*.cmd -Exclude *.old.cmd,*.old.bat -Recurse

正規表現を使用したフィルタリング

Get-ChildItem -Path "V:\Myfolder" -Recurse
| Where-Object { $_.Name -match '\ACopyForBuild\.[(bat)|(cmd)]\Z' }
5
MovGP0

これが私が苦労した後についに思い付いた方法です。

Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*

出力をきれいにする(パスのみ)には、次のようにします。

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname

最初の結果だけを取得するには、次のようにします。

(Get-ChildItem -Recurse -Path path/with/wildc*rds/ -Include file.*).fullname | Select -First 1

今重要なもののために:

ファイル/ディレクトリのみを検索するには、-Fileまたは-Directoryを使用してくださいnotしてください(以下を参照)。代わりにこれをファイルに使用します。

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

ディレクトリの-eq $falseを削除します。 bin/*のように末尾にワイルドカードを付けないでくださいnot

内蔵のスイッチを使わないのはなぜ?彼らはひどいし、ランダムに機能を削除します。たとえば、ファイルで-Includeを使用するには、パスをワイルドカードで終了する必要があります。しかし、これはあなたに告げることなく-Recurseスイッチを無効にします。

Get-ChildItem -File -Recurse -Path ./bin/* -Include *.lib

これはすべてのサブディレクトリのすべての*.libを与えることになると思いますが、それはbinのトップレベルのみを検索します。

ディレクトリを検索するには、-Directoryを使用できますが、最後のワイルドカードを削除する必要があります。何らかの理由で、これは-Recurseを無効にしません。これらの理由から、組み込みフラグを使用しないことをお勧めします。

このコマンドはかなり短くすることができます。

Get-ChildItem -Recurse -Path ./path*/ -Include name* | where {$_.PSIsContainer -eq $false}

になる

gci './path*/' -s -Include 'name*' | where {$_.PSIsContainer -eq $false}
  • Get-ChildItemgciにエイリアスされています
  • -Pathはデフォルトで位置0になっているので、最初の引数をパスにするだけです。
  • -Recurse-sのエイリアスです
  • -Includeに速記はありません
  • 名前/パス内のスペースには一重引用符を使用して、コマンド全体を二重引用符で囲み、コマンドプロンプトで使用できるようにします。逆にすると(一重引用符で囲む)エラーが発生します
0
Khan Power