特定のタイプに属するサブフォルダーに存在するファイルを含むすべてのファイルを取得する必要があります。
Get-ChildItemを使用して、このようなことをしています。
Get-ChildItem "C:\windows\System32" -Recurse | where {$_.extension -eq ".txt"}
ただし、パス全体ではなく、ファイル名のみが返されます。
特定のタイプに属するサブフォルダーに存在するファイルを含むすべてのファイルを取得する必要があります。
Get-ChildItemを使用して、このようなことをしています。
Get-ChildItem "C:\windows\System32" -Recurse | where {$_.extension -eq ".txt"}
ただし、パス全体ではなく、ファイル名のみが返されます。
| select FullName
上記の行の最後に追加します。後で実際に何かを行う必要がある場合は、次のように、それをforeachループにパイプする必要があります。
get-childitem "C:\windows\System32" -recurse | where {$_.extension -eq ".txt"} | % {
Write-Host $_.FullName
}
これは、レイトフィルタリングを使用するよりもはるかに高速に実行されるはずです。
Get-ChildItem C:\WINDOWS\System32 -Filter *.txt -Recurse | % { $_.FullName }
次のようにSelect-Objectを使用することもできます。
Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName
これは短いものです:
(Get-ChildItem C:\MYDIRECTORY -Recurse).fullname > filename.txt
-Name
相対パスが必要な場合は、フラグを使用できます。
Get-ChildItem "C:\windows\System32" -Recurse -Filter *.txt -Name
これを試して:
Get-ChildItem C:\windows\System32 -Include *.txt -Recurse | select -ExpandProperty FullName
Get-ChildItem -Recurse *.txt | Format-Table FullName
それが私が使ったものです。ループ構文が含まれていないので、より理解しやすいと思います。
PS5では本当に厄介なことです。$_がforeach内のフルパスにはなりません。これらは、FileInfoおよびDirectoryInfoオブジェクトの文字列バージョンです。何らかの理由で、パス内のワイルドカードで修正するか、Powershell6または7を使用します。途中でget-itemにパイプすることもできます。
Get-ChildItem -path C:\WINDOWS\System32\*.txt -Recurse | foreach { "$_" }
Get-ChildItem -path C:\WINDOWS\System32 -Recurse | get-item | foreach { "$_" }
これは、.Net Core(Powershell 7)で解決された.Netの問題のようです 。FileInfo/ Directoryインスタンスの文字列化の動作がv6.0.2から変更されました#7132
これは私のために働き、名前のリストを作成します:
$Thisfile=(get-childitem -path 10* -include '*.JPG' -recurse).fullname
get-member -membertype properties
信じられないほど便利なコマンドを使用して見つけました。.<thing>
ここにあるように、それが提供するほとんどのオプションには、が追加されfullname
ます。同じコマンドを貼り付けることができます。
| get-member -membertype properties
コマンドの最後に、コマンドで実行できることとそれらにアクセスする方法に関する詳細情報を取得します。
get-childitem -path 10* -include '*.JPG' -recurse | get-member -membertype properties
gci "C:\WINDOWS\System32" -r -include .txt | select fullname
この行コマンドを使用して、「C:\ Temp」内の「.xlm」ファイルを検索し、結果はファイル「result.txt」内のフルネームパスを出力しました。
(Get-ChildItem "C:\Temp" -Recurse | where {$_.extension -eq ".xml"} ).fullname > result.txt
私のテストでは、この構文は私にとって美しく機能します。
なぜ誰もforeachループをまだ使用していないのですか?ここでの長所は、変数に簡単に名前を付けることができることです。
# Note that I'm pretty explicit here. This would work as well as the line after:
# Get-ChildItem -Recurse C:\windows\System32\*.txt
$fileList = Get-ChildItem -Recurse -Path C:\windows\System32 -Include *.txt
foreach ($textfile in $fileList) {
# This includes the filename ;)
$filePath = $textfile.fullname
# You can replace the next line with whatever you want to.
Write-Output $filePath
}
[代替構文]
一部の人々にとって、方向性パイプオペレーターは彼らの好みではありませんが、むしろ連鎖を好みます。roslyn Issue Trackerで共有されているこのトピックに関するいくつかの興味深い意見を参照してください:dotnet / roslyn#5445。
ケースとコンテキストに基づいて、このアプローチの1つは暗黙的(または間接的)と見なすことができます。たとえば、この場合、列挙可能なrequiresに対してパイプを使用するには、特別なトークン$_
(別名PowerShell's "THIS" token
)が不快に見える場合があります。
そのような仲間のために、これはドットチェーンでそれを行うためのより簡潔で簡単な方法です:
(gci . -re -fi *.txt).FullName
(<rant> PowerShellのコマンド引数パーサーは部分的なパラメーター名を受け入れることに注意してください。したがって、;、、、、、、およびに加えて、-recursive
受け入れられます-recursiv
が、残念ながら..は、単一の文字で意味のある唯一の正しい選択です( POSIXy UNIXyの規則に従ってください)!</ rant>)-recursi
-recurs
-recur
-recu
-rec
-re
-r
-
以下のスクリプトを使用して、すべてのフォルダーパスを抽出しています。
Get-ChildItem -path "C:\" -Recurse -Directory -Force -ErrorAction SilentlyContinue | Select-Object FullName | Out-File "Folder_List.csv"
完全なフォルダパスは来ていません。113文字の後、来ています:
Example - C:\ProgramData\Microsoft\Windows\DeviceMetadataCache\dmrccache\en-US\ec4d5fdd-aa12-400f-83e2-7b0ea6023eb7\Windows...
パラメータと形式としてディレクトリパス文字列を含む実行可能ファイルがあるという問題がありました。このような:
"C:\ temp \ executeable.exe" "C:\ storage \ filename" "C:\ storage \ dump" -jpg
このコマンドは、さまざまなフォルダーにあるテラバイト単位の.jpgファイルで実行する必要がありました。
$files = Get-ChildItem -Path C:\storage\*.jpg -Recurse -Force | Select-Object -ExpandProperty FullName
for ($i=0; $i -lt $files.Count; $i++) {
[string]$outfile = $files[$i]
Start-Process -NoNewWindow -FilePath "C:\temp\executable.exe" -ArgumentList $outfile, "C:\storage\dump", "-dcm"
}