2012-10-29 44 views
83

我需要獲取包含屬於特定類型的子文件夾中的文件的所有文件。獲取PowerShell中文件的完整路徑

我做這樣的事情,使用Get-ChildItem

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

然而,這只是我返回的文件名,而不是整個路徑。

回答

135

| select FullName添加到上方行的末尾。如果您需要實際做的東西之後,你可能要管它變成一個foreach循環,就像這樣:

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

這應該執行比使用後期過濾快得多:

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

這是事實。警告:這個命令實際上得到的文件類似'* .txt *'('-Filter'使用CMD通配符)。如果這不是你想要的,那麼使用'-Include * .txt'。 –

6

這裏的較短的一個:

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

這裏是一個較短的: '(gci -r c:\)。fullname' –

13

您還可以使用Select-Object像這樣:

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

請注意'Select-Object'返回'PSCustomObject',而不是一個字符串。如果你使用結果作爲另一個程序的參數,它可能不起作用 – Chintsu

+4

是@Chintsu說的。要獲取字符串而不是'PSCustomObject',請使用「-ExpandProperty FullName」而不是簡單的'FullName'。據我所知,'-ExpandProperty'參數導致cmdlet返回結果作爲指定屬性的(native?)類型,而不是作爲一些自定義對象。 – doubleDown

1

試試這個:

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

請添加一些關於您的嘗試與另一個不起作用的信息。 –

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

您能否詳細說明您的答案,並添加關於您提供的解決方案的更多描述? – abarisone

1

[替代語法]

對於一些人來說,定向管道運營商都沒有自己的口味,但他們寧可選擇鏈接。在roslyn問題跟蹤器中共享有關此主題的一些有趣觀點:dotnet/roslyn#5445

基於案例和上下文,這種方法之一可以被認爲是隱式的(或間接的)。例如,在這種情況下,針對枚舉使用管道需要特殊令牌$_(又名PowerShell's "THIS" token)可能會讓某些人感到厭惡。

對於這樣的傢伙,這裏是點鏈接做的更加簡潔,直接的方式:

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

(<咆哮>請注意,PowerShell的命令參數解析器接受部分參數名稱所以除了-recursive; -recursiv-recursi-recurs-recur-recu-rec-re被接受,但不幸的是沒有-r ..這是唯一正確的荊e對於單個-字符有意義(如果我們按照POSIXy UNIXy約定)! < /咆哮>)

+1

請注意:'-r'的縮寫'-Recurse'對我來說工作正常。 – Polymorphix

+0

@Polymorphix,你是對的,它在Windows 10上爲我工作(不知道我以前試過哪個版本)。然而,在樣本中'-File'開關'-fi'也是如此:'-fil'和'-file'有效,但不是'-f'。按照POSIX風格,它應該是'--file'(多字母)和'-f'(單字母,除非-f被保留用於別的東西,比如'force'開關,那麼它可以是其他類似的東西'-l'或者根本沒有單字母選項)。 –

0

這爲我工作,併產生的名單:

$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 -Recurse *.txt | Format-Table FullName 

這是我用什麼。我覺得它更容易理解,因爲它不包含任何循環語法。

5

如果相對路徑是你想要的,你可以使用-Name標誌。

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