2012-10-29 42 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