รับเส้นทางแบบเต็มของไฟล์ใน PowerShell


147

ฉันต้องการรับไฟล์ทั้งหมดรวมถึงไฟล์ที่มีอยู่ในโฟลเดอร์ย่อยที่เป็นประเภทเฉพาะ

ฉันกำลังทำสิ่งนี้โดยใช้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
นี่เป็นเรื่องจริง A caveat: คำสั่งนี้ได้รับไฟล์เช่น*.txt*( -Filterใช้สัญลักษณ์ตัวแทน CMD) -Include *.txtถ้าไม่ได้เป็นสิ่งที่คุณต้องการแล้วใช้
Roman Kuzmin

26

คุณยังสามารถใช้Select-Objectดังนี้:

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

5
โปรดทราบว่าSelect-ObjectผลตอบแทนPSCustomObjectไม่ใช่สตริง อาจไม่ทำงานหากคุณใช้ผลลัพธ์เป็นพารามิเตอร์สำหรับโปรแกรมอื่น
Chintsu

5
ใช่สิ่งที่ @Chintsu พูด ในการรับสตริงแทนที่จะPSCustomObjectใช้-ExpandProperty FullNameเพียงอย่างFullNameเดียว เท่าที่ฉันเข้าใจ-ExpandPropertyพารามิเตอร์ทำให้ cmdlet ส่งคืนผลลัพธ์เป็นชนิด (เนทีฟ) ของคุณสมบัติที่ระบุแทนที่จะเป็นวัตถุที่กำหนดเอง
doubleDown

ฉันต้องการเวลาด้วย (ฉันยุ่งกับแหล่งที่มาของโปรแกรมและคิดในภายหลังว่าฉันน่าจะเริ่มต้นการควบคุมซอร์สได้ แต่ฉันสามารถรับความคิดในการคอมมิทครั้งแรกกับ "master" โดยรับไฟล์ตั้งแต่การติดตั้ง:Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
Neil Guy Lindberg

19

นี่คือสั้นกว่า:

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

23
นี่คืออันที่สั้นกว่า:(gci -r c:\).fullname
Chris 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 ด้วยเหตุผลบางอย่าง wildcard ในพา ธ แก้ไขหรือใช้ Powershell 6 หรือ 7 นอกจากนี้คุณยังสามารถไพพ์เพื่อรับไอเท็มที่อยู่ตรงกลาง

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

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

ดูเหมือนว่าจะมีปัญหากับ. Net ที่ได้รับการแก้ไขใน. Net Core (Powershell 7): พฤติกรรมการสตริงของอินสแตนซ์ FileInfo / Directory มีการเปลี่ยนแปลงตั้งแต่ v6.0.2 # 7132


4

สิ่งนี้ได้ผลสำหรับฉันและสร้างรายชื่อ:

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

ฉันพบมันโดยใช้get-member -membertype propertiesคำสั่งที่มีประโยชน์อย่างไม่น่าเชื่อ ตัวเลือกส่วนใหญ่ที่ให้คุณต่อท้ายด้วย a .<thing>, like fullnameis here คุณสามารถใช้คำสั่งเดียวกันได้

  | 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

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
}

ฉันจะรับ filepath แต่ละไฟล์ของ textfile โดยไม่ใช้ foreach textfile ใน fileList ได้อย่างไร สิ่งที่ชอบ textfile = $ fileList [$ i]. ชื่อเต็มฉันรู้ว่าไม่ใช่วิธีที่ดีที่สุด แต่ฉันต้องทำให้มันเป็นแบบนี้ :(
Heber Solis

เพียงเพิ่ม$ในด้านหน้าของ:textfile $textfile = $fileList[$i].FullNameสมมติว่า$iมีค่าตัวเลขกล่าวคือ
NostraDavid

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

6
คุณช่วยอธิบายรายละเอียดเพิ่มเติมเกี่ยวกับโซลูชันที่คุณให้ได้ไหม
abarisone

1

[ไวยากรณ์ทางเลือก]

สำหรับบางคนผู้ประกอบการท่อทิศทางไม่ใช่รสนิยมของพวกเขา แต่พวกเขาค่อนข้างชอบผูกมัด ดูความเห็นที่น่าสนใจบางเรื่องนี้ร่วมกันในติดตามปัญหา Roslyn: dotnet / Roslyn # 5445

ขึ้นอยู่กับกรณีและบริบทหนึ่งในวิธีการนี้สามารถพิจารณาเป็นนัย (หรือทางอ้อม) ตัวอย่างเช่นในกรณีนี้การใช้ไพพ์เทียบกับการแจกแจงต้องใช้โทเค็นพิเศษ$_(aka PowerShell's "THIS" token) อาจดูน่ารังเกียจสำหรับบางคน

สำหรับ fellas ดังกล่าวนี่เป็นวิธีที่รัดกุมและตรงไปตรงมามากขึ้นในการทำด้วยการผูกมัดแบบจุด :

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

(<พูดจาโผงผาง> หมายเหตุว่า PowerShell ของข้อโต้แย้งคำสั่ง parser ยอมรับชื่อพารามิเตอร์บางส่วนดังนั้นนอกเหนือไป. -recursive; -recursiv, -recursi, -recurs, -recur, -recu, -recและ-reได้รับการยอมรับ แต่น่าเสียดายที่ไม่ได้-r.. ซึ่งเป็นทางเลือกเดียวที่ถูกต้องที่จะทำให้ความรู้สึกที่มีซิงเกิ้ล-ตัวอักษร (ถ้าเรา ดำเนินการตาม POSIX ข้อตกลง UNIX)) </rant>)


1
หมายเหตุถึงการพูดจาโผงผาง: -rรูปแบบการ-Recurseทำงานสั้น ๆสำหรับฉัน
Polymorphix

@ Polymorphix คุณพูดถูกมันใช้ได้กับฉันใน Windows 10 (ไม่แน่ใจว่าฉันลองรุ่นไหนก่อนหน้านี้) อย่างไรก็ตามเดียวกันถือเป็นจริงกับ-Fileสวิทช์-fiในกลุ่มตัวอย่าง: -filและ-fileทำงาน -fแต่ไม่ได้ ไปตามสไตล์ POSIX ควรเป็น--file(ตัวอักษรหลายตัว) และ-f(ตัวอักษรเดียวยกเว้นว่า -f ถูกสงวนไว้สำหรับสิ่งอื่นพูดforceสลับแล้วมันสามารถเป็นอย่างอื่นเช่น-lหรือไม่มีตัวเลือกตัวอักษรเดียวเลย)
Raven vulcan

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

ฉันใช้คำสั่ง line นี้เพื่อค้นหาไฟล์ ".xlm" ใน "C: \ Temp" และพิมพ์เส้นทางชื่อเต็มในไฟล์ "result.txt":

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

ในการทดสอบของฉันไวยากรณ์นี้ใช้งานได้ดีสำหรับฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.