PowerShell'de dosyaların tam yolunu alma


147

Belirli bir türe ait alt klasörler içinde bulunan dosyalar da dahil olmak üzere tüm dosyaları almak gerekir.

Get-ChildItem kullanarak böyle bir şey yapıyorum :

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

Ancak, bana yolun tamamını değil, yalnızca dosya adlarını döndürüyor.

Yanıtlar:


220

Ekle | select FullNameyukarıdaki satırın sonuna kadar. Daha sonra bununla bir şey yapmanız gerekiyorsa, bunu bir foreach döngüsüne yerleştirmeniz gerekebilir, şöyle:

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

101

Bu, geç filtreleme kullanmaktan çok daha hızlı çalışmalıdır:

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

14
Bu doğru. Bir uyarı: Bu komut aslında dosyaları alır *.txt*( -FilterCMD joker karakterlerini kullanır). İstediğiniz bu değilse kullanın -Include *.txt.
Roman Kuzmin

26

Select-Object'i şu şekilde de kullanabilirsiniz :

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

5
Bir dize değil , Select-Objectdöndürdüğünü unutmayın PSCustomObject.
Sonucu

5
@Chintsu'nun söylediklerine evet. Yerine dizeleri almak için basit yerine PSCustomObjectkullanın . Anladığım kadarıyla, parametre cmdlet'in sonuçları bazı özel nesneler yerine belirtilen özelliğin (yerel?) Türü olarak döndürmesine neden olur. -ExpandProperty FullNameFullName-ExpandProperty
DoubleDown

Ben de zamana ihtiyacım vardı (bir programın kaynağına bulaştım ve daha sonra muhtemelen üzerinde kaynak kontrolüne başlamam gerektiğini düşündüm, ancak kurulumdan beri dosyaları alarak "master" a karşı ilk taahhüdüm hakkında bir fikir edinebilirim:Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName
Neil Guy Lindberg

19

İşte daha kısa olanı:

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

23
İşte daha kısa:(gci -r c:\).fullname
Chris N

11
İşte daha kısa:(ls -r c:\).fullname
Kalamane

15
İşte daha kısa:(ls -r c:).fullname
Valiante

9

Göreli yollar istediğiniz -Nameşeyse , bayrağı kullanabilirsiniz .

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


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

Ben de bunu kullandım. Herhangi bir döngü sözdizimi içermediğinden daha anlaşılır olduğunu hissediyorum.


5

PS $ 'da gerçekten sinir bozucu bir şey, $ _, foreach içindeki tam yol olmayacak. Bunlar FileInfo ve DirectoryInfo nesnelerinin dize versiyonlarıdır. Herhangi bir nedenden dolayı yoldaki bir joker karakter bunu düzeltir veya Powershell 6 veya 7'yi kullanır.

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

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

Bu, .Net Core'da (Powershell 7) çözülen .Net ile ilgili bir sorun gibi görünüyor: FileInfo / Directory örneklerinin dize oluşturma davranışı v6.0.2 # 7132'den beri değişti


4

Bu benim için çalıştı ve bir isim listesi üretir:

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

Bunu get-member -membertype propertiesinanılmaz faydalı bir komut kullanarak buldum . size sunduğu seçeneklerin çoğu , burada olduğu .<thing>gibi bir eklenir fullname. Aynı komutu yapıştırabilirsiniz;

  | get-member -membertype properties 

onlarla yapabileceğiniz şeyler ve bunlara nasıl erişeceğiniz hakkında daha fazla bilgi almak için herhangi bir komutun sonunda:

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

3

Bunu dene:

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

2
Lütfen teşebbüsünüzle neyin farklı olduğuna ve diğerinin neden çalışmadığına dair biraz bilgi ekleyin.
Uwe Allner

2

Neden kimse foreach döngüsünü kullanmadı? Burada bir profesyonel, değişkeninizi kolayca adlandırabilmenizdir:

# 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 içinde foreach textfile kullanmadan bir textfile dosya yolunu nasıl alabilirim? textfile = $ fileList [$ i] .fullname gibi bir şey, biliyorum ki en uygun yaklaşım değil ama bunu şu şekilde yapmalıyım :(
Heber Solis

Sadece bir ekleme $önünde textfile: $textfile = $fileList[$i].FullName. $iSayısal bir değeri varsayarsak .
NostraDavid

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

6
Verdiğiniz çözüm hakkında biraz daha açıklama ekleyerek cevabınızı daha ayrıntılı açıklayabilir misiniz?
abarisone

1

[alternatif sözdizimi]

Bazı insanlar için, yönlü boru operatörleri onların tadı değil, zincirlemeyi tercih ederler. Bu konu ile ilgili bazı ilginç fikirlere bakın roslyn issue tracker: dotnet / roslyn # 5445 .

Vaka ve bağlama dayanarak, bu yaklaşımlardan birinin örtük (veya dolaylı) olduğu düşünülebilir. Örneğin, bu durumda numaralandırılabilir gereksinimlere karşı boru kullanmak , bazılarına özel belirteç $_(aka PowerShell's "THIS" token) tatsız görünebilir.

Bu tür arkadaşlar için, nokta zincirleme ile bunu yapmanın daha özlü, basit bir yolu var :

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

(<rant> PowerShell komut argümanlar çözümleyici kısmi parametre adları kabul Böylece ek olarak Not. -recursive; -recursiv, -recursi, -recurs, -recur, -recu, -recve -rekabul, ama ne yazık değildir -rtek olan mantıklı gelen tek doğru seçim olduğu .. -(karakterin Eğer biz POSIXy UNIXy kurallarına uyun)! </rant>)


1
Rant not: benim için iyi çalışır -rkısa formu -Recurse.
Polymorphix

@Polymorphix, haklısın, Windows 10'da benim için çalışıyor (daha önce hangi sürümü denediğimden emin değilim). Ancak, aynısı örnekteki -Fileanahtarla -fida geçerlidir : -filve -fileçalışır, ama değildir -f. POSIX stiline göre, --file(çok harfli) ve -f(tek harf, -f başka bir şey için ayrılmış değilse, forceanahtar deyin , o zaman başka bir şey olabilir -lveya hiç tek harf seçeneği olmayabilir ) olmalıdır.
vulcan raven

1

Tüm klasör yolunu extact için aşağıdaki komut dosyası kullanıyorum:

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

Tam klasör yolu gelmiyor. 113 karakterden sonra geliyor:

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

0

Ben "C: \ Temp" ".xlm" dosyaları ve "sonuç.txt" dosyasında sonuç yazdırma tam ad yolunu aramak için bu satır komutunu kullandım:

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

Testlerimde, bu sözdizimi benim için güzel çalışıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.