特定のタイプに属するサブフォルダーにあるファイルを含むすべてのファイルを取得する必要があります。
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-Objectを使用することもできます。
Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName
Select-Object
返すことPSCustomObject
に注意してください。別のプログラムのパラメータとして結果を使用すると、機能しない可能性があります
PSCustomObject
、使用-ExpandProperty FullName
するだけの代わりにFullName
。私が理解している限り、-ExpandProperty
parameterを使用すると、コマンドレットはカスタムオブジェクトとしてではなく、指定されたプロパティの(ネイティブ?)タイプとして結果を返します。
Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
PS 5では本当に厄介なことですが、$ _はforeach内の完全なパスではありません。これらは、FileInfoオブジェクトとDirectoryInfoオブジェクトの文字列バージョンです。何らかの理由で、パスのワイルドカードで修正されるか、Powershell 6または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
これを試して:
Get-ChildItem C:\windows\System32 -Include *.txt -Recurse | select -ExpandProperty FullName
なぜ誰もがまだ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
}
$
前にを追加するだけtextfile
です$textfile = $fileList[$i].FullName
。$i
つまり、数値があると仮定します。
gci "C:\WINDOWS\System32" -r -include .txt | select fullname
[代替構文]
一部の人々にとって、方向性パイプ演算子は好みではありませんが、むしろチェーンを好んでいます。roslyn issue tracker:dotnet / roslyn#5445で共有されているこのトピックに関するいくつかの興味深い意見をご覧ください。
ケースとコンテキストに基づいて、このアプローチの1つは暗黙的(または間接的)と見なすことができます。たとえば、この場合、列挙型に対してパイプを使用するには、特別なトークン$_
(別名PowerShell's "THIS" token
)が、一部のユーザーには不愉快に思えるかもしれません。
そのようなフェラのために、ここにドットチェーンでそれを行うより簡潔で簡単な方法があります:
(gci . -re -fi *.txt).FullName
(<暴言>ノートのPowerShellのコマンド引数パーサが部分的にパラメータ名を受け入れるように加えインチ-recursive
; -recursiv
、-recursi
、-recurs
、-recur
、-recu
、-rec
と-re
受け入れられているが、残念ながらありません-r
。..単一で理にかなっている唯一の正しい選択である-
私達場合文字( POSIXy UNIXy規約に従ってください!)</ rant>)
-r
短い形式は-Recurse
うまく機能します。
-File
switch -fi
でも同じことが当てはまり-fil
、-file
機能しますが、機能しません-f
。POSIXスタイルでは、--file
(複数文字)と-f
(1文字です。-fが他の何かのために予約されていない限り(force
スイッチなど)、それは他のようなものである-l
か、まったく単一文字のオプションではない可能性があります)。
以下のスクリプトを使用して、すべてのフォルダーパスを抽出します。
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...
*.txt*
(-Filter
CMDワイルドカードを使用)のようなファイルを取得します。これが必要なものでない場合は、を使用してください-Include *.txt
。