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


238

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

Copyforbuild.bat いろいろなところにありますので、再帰的に検索したいと思います。

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

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

回答:


393

使用するには、Get-ChildItemコマンドレットとコマンドレットを-Recurseスイッチ:

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

1
アクセス権限のないディレクトリで実行されると、プロセスが終了するため、検索全体が中止されるという問題があるようです。それを回避する方法はありますか?
deed02392 2013年

6
ErrorActionパラメータをContinueまたはSilentlyContinueに設定してみてください(値が言及されていない場合)。
Shay Levy

22
まったく同じことをする短い方法: cd V:\MyFolder続きls -r -inc CopyForBuild.bat
Orion Edwards

8
したがって、上記のコメンターが意味するのは...ls -r -ea silentlycontinue -fo -inc "filename.txt" | % { $_.fullname }
Andrew

*ファイル名の末尾にアスタリスク記号()を追加して、部分的な文字列を実行するようにこの回答を調整しました。****** LINE1:$File = "Microsoft.OData.Core.NetFX35.V7*"LINE2:$Folder = "C:\Program Files"LINE3:Get-ChildItem -Path $Folder -Filter $File -Recurse -ErrorAction SilentlyContinue -Force
SherlockSpreadsheets

37

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

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

あなたは、常にワイルドカードを使用することができます*FolderName、および/またはFileName.fileExtension。例えば:

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

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

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

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

またはその逆:

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

4
この答えは、特定のユースケース(実際には探しているファイルを使用したい)に対応しているため、非常に便利です。| あなたにファイルのフルネームを与えるために、他の答えには欠けているものがあります。
Newteq開発者2017

1
ここで@ Sanity1123に同意する必要があります。実際にファイルを使用する場合は、ファイルの完全パスが必要です。私見これは受け入れられる答えであるべきです。
uceumern 2018年

31

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

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

12
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat

も動作します


結果をファイルに出力したい場合は、コマンドの最後に `> path_to_filename.txt`を追加できます。
Gwen Au

7

これが私が苦労して最後に思いついた方法です:

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

ここで重要なものについて:

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

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

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

組み込みのスイッチを使用しないのはなぜですか?彼らはひどいですし、ランダムに機能を削除します。たとえば-Include、ファイルで使用するには、パスの末尾をワイルドカードにする必要があります。ただし、これは通知-Recurseせずにスイッチを無効にします。

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

あなたはそれが*.libすべてのサブディレクトリのすべてのs を与えると思うでしょうが、それはトップレベルののみを検索しますbin

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

このコマンドはかなり短くできます:

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

なる

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

6

これを試して:

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

2
を使用| Where-Object { !$_PSIsContainer }してフォルダを除外することもできます
Gargravarr 2016年

5

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

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' }

1
そうじゃないの'\ACopyForBuild\.(bat|cmd)\Z'
E. Sundin

1

@ user3303020回答に追加して検索結果をファイルに出力するには、次のコマンドを実行します。

Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat > path_to_results_filename.txt

その方法で正しいファイルを検索する方が簡単な場合があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.