Dapatkan path lengkap file di PowerShell

146

Saya perlu mendapatkan semua file termasuk file yang ada di subfolder yang termasuk jenis tertentu.

Saya melakukan sesuatu seperti ini, menggunakan Get-ChildItem :

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

Namun, itu hanya mengembalikan saya nama file dan bukan seluruh path.

Gagan
sumber

Jawaban:

220

Tambahkan | select FullNameke akhir baris Anda di atas. Jika Anda benar-benar perlu melakukan sesuatu dengan itu setelah itu, Anda mungkin harus menyalurkannya ke loop foreach, seperti:

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

Ini akan bekerja jauh lebih cepat daripada menggunakan pemfilteran terlambat:

Get-ChildItem C:\WINDOWS\System32 -Filter *.txt -Recurse | % { $_.FullName }
Shay Levy
sumber
14
Ini benar. Peringatan: perintah ini benar-benar mendapatkan file seperti *.txt*( -Filtermenggunakan CMD wildcard). Jika ini bukan yang Anda inginkan, gunakan -Include *.txt.
Roman Kuzmin
26

Anda juga dapat menggunakan Select-Object seperti:

Get-ChildItem "C:\WINDOWS\System32" *.txt -Recurse | Select-Object FullName
imlokesh
sumber
5
Perhatikan bahwa Select-Objectkembali PSCustomObject, bukan string. Mungkin tidak berfungsi jika Anda menggunakan hasil sebagai parameter untuk program lain
Chintsu
5
Ya untuk apa yang dikatakan @Chintsu. Untuk mendapatkan string alih-alih PSCustomObject, gunakan -ExpandProperty FullNamebukan hanya FullName. Sejauh yang saya mengerti, -ExpandPropertyparameter menyebabkan cmdlet untuk mengembalikan hasil sebagai tipe (asli?) Properti yang ditentukan, bukan sebagai beberapa objek kustom.
doubleDown
Saya membutuhkan waktu juga (saya telah mengacaukan sumber dari suatu program dan berpikir kemudian bahwa saya mungkin harus mulai mengendalikan sumbernya, tetapi saya bisa mendapatkan gagasan tentang komit pertama saya terhadap "master" dengan mendapatkan file sejak instalasi:Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
Neil Guy Lindberg
19

Ini yang lebih pendek:

(Get-ChildItem C:\MYDIRECTORY -Recurse).fullname > filename.txt
JustAGuy
sumber
23
Ini yang lebih pendek:(gci -r c:\).fullname
Chris N
11
Ini yang lebih pendek:(ls -r c:\).fullname
Kalamane
15
Ini yang lebih pendek:(ls -r c:).fullname
Valiante
9

Jika jalur relatif adalah apa yang Anda inginkan, Anda bisa menggunakan -Namebendera.

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

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

Itulah yang saya gunakan. Saya merasa itu lebih dimengerti karena tidak mengandung sintaks loop.

Mandrake
sumber
5

Sungguh hal yang menjengkelkan di PS 5, di mana $ _ tidak akan menjadi path lengkap dalam foreach. Ini adalah versi string objek FileInfo dan DirectoryInfo. Untuk beberapa alasan, wildcard di jalur memperbaikinya, atau menggunakan Powershell 6 atau 7. Anda juga dapat melakukan pipe untuk mendapatkan item di tengah.

Get-ChildItem -path C:\WINDOWS\System32\*.txt -Recurse | foreach { "$_" }

Get-ChildItem -path C:\WINDOWS\System32 -Recurse | get-item | foreach { "$_" }

Ini sepertinya merupakan masalah dengan .Net yang dapat diselesaikan dalam .Net Core (Powershell 7): Perilaku stringifikasi dari instance FileInfo / Directory telah berubah sejak v6.0.2 # 7132

js2010
sumber
4

Ini berhasil untuk saya, dan menghasilkan daftar nama:

$Thisfile=(get-childitem -path 10* -include '*.JPG' -recurse).fullname

Saya menemukannya dengan menggunakan get-member -membertype properties, perintah yang sangat berguna. sebagian besar opsi itu memberi Anda ditambahkan dengan .<thing>, seperti di fullnamesini. Anda dapat menempel perintah yang sama;

  | get-member -membertype properties 

di akhir setiap perintah untuk mendapatkan informasi lebih lanjut tentang hal-hal yang dapat Anda lakukan dengan mereka dan cara mengaksesnya:

get-childitem -path 10* -include '*.JPG' -recurse | get-member -membertype properties
L1ttl3J1m
sumber
3

Coba ini:

Get-ChildItem C:\windows\System32 -Include *.txt -Recurse | select -ExpandProperty FullName
Mykhailo Basiuk
sumber
2
Harap tambahkan sedikit informasi tentang apa yang berbeda dengan upaya Anda dan mengapa yang lain tidak berhasil.
Uwe Allner
2

Mengapa belum ada yang menggunakan loop foreach? Pro di sini adalah Anda dapat dengan mudah memberi nama variabel Anda:

# 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
}
NostraDavid
sumber
bagaimana saya bisa mendapatkan file individual dari file teks tanpa menggunakan file teks terlebih dahulu di fileList? sesuatu seperti textfile = $ filelist [$ i] .fullname, saya tahu ini bukan pendekatan yang paling optimal tapi saya harus membuatnya seperti ini :(
Heber Solis
Hanya menambahkan $di depan textfile: $textfile = $fileList[$i].FullName. Dengan asumsi $imemiliki nilai numerik, yaitu.
NostraDavid
1
gci "C:\WINDOWS\System32" -r -include .txt | select fullname
Vuong Doan
sumber
6
Bisakah Anda menjelaskan lebih lanjut jawaban Anda dengan menambahkan sedikit deskripsi tentang solusi yang Anda berikan?
abarisone
1

[sintaksis alternatif]

Bagi sebagian orang, operator pipa directional bukan seleranya, tetapi mereka lebih suka chaining. Lihat beberapa pendapat menarik tentang topik ini yang dibagikan dalam pelacak isu roslyn: dotnet / roslyn # 5445 .

Berdasarkan kasus dan konteksnya, salah satu pendekatan ini dapat dianggap implisit (atau tidak langsung). Misalnya, dalam hal ini menggunakan pipa terhadap enumerable memerlukan token khusus $_(alias PowerShell's "THIS" token) mungkin tampak tidak menyenangkan bagi sebagian orang.

Untuk fellas semacam itu, berikut ini cara yang lebih ringkas dan langsung untuk melakukannya dengan dot chaining :

(gci . -re -fi *.txt).FullName

(<kata-kata kasar> Perhatikan bahwa PowerShell ini argumen perintah parser menerima nama-nama parameter parsial Jadi selain. -recursive; -recursiv, -recursi, -recurs, -recur, -recu, -recdan -rediterima, tapi sayangnya tidak -r.. yang merupakan pilihan hanya yang benar yang masuk akal dengan single -karakter (jika kita ikuti konvensi POSIXy UNIXy)! </rant>)

gagak vulcan
sumber
1
Catatan untuk kata-kata kasar: -rbentuk pendek -Recurseberfungsi dengan baik untuk saya.
Polymorphix
@ Polymorphix, Anda benar, ini berfungsi untuk saya di Windows 10 (tidak yakin versi mana yang saya coba sebelumnya). Namun, hal yang sama berlaku dengan -Filesaklar -fidalam sampel: -fildan -fileberfungsi, tetapi tidak -f. Pergi dengan gaya POSIX, itu harus --file(multi-huruf) dan -f(huruf tunggal, kecuali -f dicadangkan untuk sesuatu yang lain, katakan forceswitch, maka itu bisa menjadi sesuatu yang lain seperti -latau tidak ada opsi huruf tunggal sama sekali).
gagak vulcan
1

Saya menggunakan skrip di bawah ini untuk memperluas semua jalur folder:

Get-ChildItem -path "C:\" -Recurse -Directory -Force -ErrorAction SilentlyContinue | Select-Object FullName | Out-File "Folder_List.csv"

Jalur folder lengkap tidak akan datang. Setelah 113 karakter, akan datang:

Example - C:\ProgramData\Microsoft\Windows\DeviceMetadataCache\dmrccache\en-US\ec4d5fdd-aa12-400f-83e2-7b0ea6023eb7\Windows...
Ankit Gupta
sumber
0

Saya menggunakan perintah baris ini untuk mencari ".xlm" file dalam "C: \ Temp" dan hasil cetak path nama lengkap dalam file "result.txt":

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

Dalam pengujian saya, sintaks ini berfungsi baik untuk saya.

Josué Salomão
sumber