Nhận đường dẫn đầy đủ của các tệp trong PowerShell


145

Tôi cần lấy tất cả các tệp bao gồm các tệp có trong các thư mục con thuộc về một loại cụ thể.

Tôi đang làm một cái gì đó như thế này, sử dụng Get-ChildItem :

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

Tuy nhiên, nó chỉ trả lại cho tôi tên tệp chứ không phải toàn bộ đường dẫn.

Câu trả lời:


219

Thêm | select FullNamevào cuối dòng của bạn ở trên. Nếu bạn thực sự cần phải làm một cái gì đó với điều đó sau đó, bạn có thể phải chuyển nó thành một vòng lặp foreach, như vậy:

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

101

Điều này sẽ thực hiện nhanh hơn nhiều so với sử dụng bộ lọc muộn:

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

14
Đây là sự thật. Thông báo trước: lệnh này thực sự có được các tệp như *.txt*( -Filtersử dụng ký tự đại diện CMD). Nếu đây không phải là những gì bạn muốn thì sử dụng -Include *.txt.
Roman Kuzmin

26

Bạn cũng có thể sử dụng Chọn-Đối tượng như vậy:

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

5
Lưu ý rằng Select-Objecttrả về PSCustomObject, không phải là một chuỗi. Nó có thể không hoạt động nếu bạn sử dụng kết quả làm tham số cho một chương trình khác
Chintsu

5
Có với những gì @Chintsu nói. Để có được chuỗi thay vì PSCustomObject, sử dụng -ExpandProperty FullNamethay vì đơn giản FullName. Theo tôi hiểu, -ExpandPropertytham số làm cho lệnh ghép ngắn trả về kết quả dưới dạng loại (gốc?) Của thuộc tính được chỉ định thay vì như một số đối tượng tùy chỉnh.
doubleDown 22/2/2016

Tôi cũng cần thời gian (Tôi đã nhầm lẫn với nguồn của một chương trình và sau đó tôi nghĩ rằng có lẽ tôi đã bắt đầu kiểm soát nguồn trên nó, nhưng tôi có thể biết được cam kết đầu tiên của mình chống lại "chủ" bằng cách nhận tệp từ khi cài đặt:Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
Neil Guy Lindberg

19

Đây là một cái ngắn hơn:

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

23
Đây là một cái ngắn hơn:(gci -r c:\).fullname
Chris N

11
Đây là một cái ngắn hơn:(ls -r c:\).fullname
Kalamane

15
Đây là một cái ngắn hơn:(ls -r c:).fullname
Valiante

9

Nếu đường dẫn tương đối là những gì bạn muốn, bạn chỉ có thể sử dụng -Namecờ.

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


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

Đó là những gì tôi đã sử dụng. Tôi cảm thấy dễ hiểu hơn vì nó không chứa bất kỳ cú pháp vòng lặp nào.


5

Điều thực sự khó chịu trong PS 5, trong đó $ _ sẽ không phải là con đường đầy đủ trong foreach. Đây là các phiên bản chuỗi của các đối tượng FileInfo và DirectoryInfo. Vì một số lý do, ký tự đại diện trong đường dẫn sẽ sửa nó hoặc sử dụng Powershell 6 hoặc 7. Bạn cũng có thể đặt ống dẫn vào mục lấy ở giữa.

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

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

Đây dường như là một vấn đề với .Net đã được giải quyết trong .Net Core (Powershell 7): Hành vi chuỗi của các phiên bản FileInfo / Directory đã thay đổi kể từ v6.0.2 # 7132


4

Điều này làm việc cho tôi và tạo ra một danh sách các tên:

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

Tôi tìm thấy nó bằng cách sử dụng get-member -membertype properties, một lệnh cực kỳ hữu ích. hầu hết các tùy chọn mà nó cung cấp cho bạn được thêm vào .<thing>, giống như fullnameở đây. Bạn có thể dính lệnh tương tự;

  | get-member -membertype properties 

ở cuối bất kỳ lệnh nào để có thêm thông tin về những điều bạn có thể làm với chúng và cách truy cập chúng:

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

3

Thử cái này:

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

2
Vui lòng thêm một chút thông tin về những gì khác biệt với nỗ lực của bạn và lý do tại sao cái kia không hoạt động.
Uwe Allner

2

Tại sao không ai sử dụng vòng lặp foreach? Một pro ở đây là bạn có thể dễ dàng đặt tên cho biến của mình:

# 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
}

Làm thế nào tôi có thể nhận được filepath riêng lẻ của một tệp văn bản mà không cần sử dụng tệp văn bản foreach trong tệp ListList? một cái gì đó như textfile = $ fileList [$ i] .fullname, tôi biết không phải là cách tiếp cận tối ưu nhất nhưng tôi cần thực hiện theo cách này :(
Heber Solis

Chỉ cần thêm một $ở phía trước textfile: $textfile = $fileList[$i].FullName. Giả sử $icó một giá trị số, đó là.
NostraDavid

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

6
Bạn có thể vui lòng giải thích thêm câu trả lời của bạn thêm một chút mô tả về giải pháp bạn cung cấp không?
abarisone

1

[cú pháp thay thế]

Đối với một số người, người vận hành đường ống định hướng không phải là sở thích của họ, nhưng họ thích xích hơn. Xem một số ý kiến ​​thú vị về chủ đề này được chia sẻ trong trình theo dõi vấn đề roslyn: dotnet / roslyn # 5445 .

Dựa trên trường hợp và bối cảnh, một trong những cách tiếp cận này có thể được coi là ẩn (hoặc gián tiếp). Ví dụ: trong trường hợp này, việc sử dụng đường ống chống lại vô số yêu cầu mã thông báo đặc biệt $_(aka PowerShell's "THIS" token) có thể gây khó chịu cho một số người.

Đối với các fellas như vậy, đây là một cách ngắn gọn hơn, thẳng thắn hơn để thực hiện nó với chuỗi chấm :

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

(<rant> Lưu ý rằng đối số lệnh phân tích cú pháp của PowerShell chấp nhận những cái tên tham số phần Vì vậy, ngoài việc. -recursive; -recursiv, -recursi, -recurs, -recur, -recu, -rec-ređược chấp nhận, nhưng tiếc là không -r.. đó là lựa chọn duy nhất đúng có ý nghĩa với đơn -ký tự (nếu chúng ta đi theo quy ước POSIXy UNIXy)! </ rant>)


1
Lưu ý cho các rant: -rhình thức ngắn -Recursehoạt động tốt cho tôi.
Polymorphix

@Polymorphix, bạn nói đúng, nó hoạt động với tôi trên Windows 10 (không chắc tôi đã thử phiên bản nào trước đó). Tuy nhiên, điều tương tự cũng đúng với -Filechuyển đổi -fitrong mẫu: -fil-filehoạt động, nhưng không -f. Đi theo kiểu POSIX, nó phải là --file(nhiều chữ cái) và -f(một chữ cái, trừ khi -f được dành riêng cho một cái gì đó, giả sử forcechuyển đổi, sau đó nó có thể là một cái gì đó khác -lhoặc không có tùy chọn một chữ cái nào cả).
quạ Vulcan

1

Tôi đang sử dụng đoạn script dưới đây để giải mã tất cả đường dẫn thư mục:

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

Đường dẫn thư mục đầy đủ không đến. Sau 113 ký tự, sắp có:

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

0

Tôi đã sử dụng lệnh dòng này để tìm kiếm các tệp ".xlm" trong "C: \ Temp" và kết quả in đường dẫn tên đầy đủ trong tệp "result.txt":

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

Trong các thử nghiệm của tôi, cú pháp này hoạt động đẹp đối với tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.