すべてのフォルダでファイルを検索しています。
Copyforbuild.bat
は多くの場所で利用可能です、そして私は再帰的に検索したいです。
$File = "V:\Myfolder\**\*.CopyForbuild.bat"
PowerShellでそれを行うにはどうすればよいですか。
-Recurse
スイッチを指定して Get-ChildItem コマンドレットを使用します。
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
セキュリティに基づいてエラーが発生する可能性があるフォルダ(例:C:\Users
)を検索するときは、次のコマンドを使用します。
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse -ErrorAction SilentlyContinue -Force
これを使用してファイルを検索し、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:\
ドライブ内の任意のフォルダを検索します。 FolderFoo
とFolderBar
という名前のフォルダがある場合、PowerShellはそれら両方のフォルダからの結果を表示します。
ファイル名とファイル拡張子についても同様です。特定の拡張子を持つファイルを検索したいがファイルの名前がわからない場合は、次のようにします。
dir -Path C:\FolderName -Filter *.fileExtension -Recurse | %{$_.FullName}
またはその逆
dir -Path C:\FolderName -Filter FileName.* -Recurse | %{$_.FullName}
Get-ChildItem V:\MyFolder -name -recurse *.CopyForbuild.bat
また働く
これを試して:
Get-ChildItem -Path V:\Myfolder -Filter CopyForbuild.bat -Recurse | Where-Object { $_.Attributes -ne "Directory"}
ワイルドカードを使用してフィルタリングします。
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' }
これが私が苦労した後についに思い付いた方法です。
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-ChildItem
はgci
にエイリアスされています-Path
はデフォルトで位置0になっているので、最初の引数をパスにするだけです。-Recurse
は-s
のエイリアスです-Include
に速記はありません