PowerShellでファイルの完全パスを取得する


146

特定のタイプに属するサブフォルダーにあるファイルを含むすべてのファイルを取得する必要があります。

Get-ChildItemを使用して、次のようなことをしています

Get-ChildItem "C:\windows\System32" -Recurse | where {$_.extension -eq ".txt"}

ただし、パス全体ではなく、ファイル名のみが返されます。

回答:


220

| select FullName上記の行の最後に追加します。その後で実際に何かを行う必要がある場合は、次のように、それをforeachループにパイプする必要がある場合があります。

get-childitem "C:\windows\System32" -recurse | where {$_.extension -eq ".txt"} | % {
     Write-Host $_.FullName
}

101

これは、遅延フィルタリングを使用するよりもはるかに高速に実行されます。

Get-ChildItem C:\WINDOWS\System32 -Filter *.txt -Recurse | % { $_.FullName }

14
これは本当です。警告:このコマンドは実際に*.txt*-FilterCMDワイルドカードを使用)のようなファイルを取得します。これが必要なものでない場合は、を使用してください-Include *.txt
ローマクズミン2012年

26

次のようにSelect-Objectを使用することもできます。

Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName

5
文字列ではなくをSelect-Object返すことPSCustomObjectに注意してください。別のプログラムのパラメータとして結果を使用すると、機能しない可能性があります
Chintsu

5
@Chintsuが言ったことに対してはい。代わりの文字列を取得するにはPSCustomObject、使用-ExpandProperty FullNameするだけの代わりにFullName。私が理解している限り、-ExpandPropertyparameterを使用すると、コマンドレットはカスタムオブジェクトとしてではなく、指定されたプロパティの(ネイティブ?)タイプとして結果を返します。
doubleDown

私は(私はプログラムのソースを台無しにし、私はおそらくその上にソース管理を開始している必要がありますが、私は私の最初のインストール以降のファイルを取得することにより、「マスター」に対してコミットのアイデアを得ることができ、後で考えのだ、あまりにも時間が必要:Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
ニールガイリンドバーグ

19

ここに短いものがあります:

(Get-ChildItem C:\MYDIRECTORY -Recurse).fullname > filename.txt

23
ここでは短い方だ:(gci -r c:\).fullname
クリスN

11
ここでは短い方だ:(ls -r c:\).fullname
Kalamane

15
ここでは短い方だ:(ls -r c:).fullname
Valiante

9

相対パスが必要な場合は、-Nameフラグを使用できます。

Get-ChildItem "C:\windows\System32" -Recurse -Filter *.txt -Name


5
Get-ChildItem -Recurse *.txt | Format-Table FullName

それが私が使ったものです。ループ構文が含まれていないため、理解しやすいと思います。


5

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


4

これは私にとってはうまくいき、名前のリストを生成します:

$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

3

これを試して:

Get-ChildItem C:\windows\System32 -Include *.txt -Recurse | select -ExpandProperty FullName

2
あなたの試みと何が違うのか、なぜ他がうまくいかなかったのかについて少し情報を追加してください。
Uwe Allner 2015

2

なぜ誰もがまだ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
}

fileListでforeach textfileを使用せずにテキストファイルの個々のファイルパスを取得するにはどうすればよいですか?textfile = $ fileList [$ i] .fullnameのようなものですが、最適な方法ではないことはわかっていますが、このようにする必要があります:(
Heber Solis

:の$前にを追加するだけtextfileです$textfile = $fileList[$i].FullName$iつまり、数値があると仮定します。
NostraDavid

1
gci "C:\WINDOWS\System32" -r -include .txt | select fullname

6
提供するソリューションについてもう少し説明を追加して、回答を詳しく説明していただけませんか?
abarisone 2015

1

[代替構文]

一部の人々にとって、方向性パイプ演算子は好みではありませんが、むしろチェーンを好んでいます。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>)


1
不満に注意してください:-r短い形式は-Recurseうまく機能します。
Polymorphix

@Polymorphix、そうです、それは私にとってWindows 10で機能しています(以前に試していたバージョンがわからない)。ただし、サンプルの-Fileswitch -fiでも同じことが当てはまり-fil-file機能しますが、機能しません-f。POSIXスタイルでは、--file(複数文字)と-f(1文字です。-fが他の何かのために予約されていない限り(forceスイッチなど)、それは他のようなものである-lか、まったく単一文字のオプションではない可能性があります)。
バルカンレイヴン

1

以下のスクリプトを使用して、すべてのフォルダーパスを抽出します。

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...

0

次の行コマンドを使用して、「C:\ Temp」内の「.xlm」ファイルを検索し、ファイル「result.txt」内の結果のフルネームパスを出力します。

(Get-ChildItem "C:\Temp" -Recurse | where {$_.extension -eq ".xml"} ).fullname > result.txt 

私のテストでは、この構文は美しく機能します。

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