在PowerShell中获取文件的完整路径

213

我需要获取属于特定类型的所有文件,包括子文件夹中存在的文件。

我正在使用 Get-ChildItem 进行如下操作:

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

然而,它只返回给我文件名而没有整个路径。

15个回答

304

在你上面的行末尾添加| select FullName。如果之后需要对其进行实际操作,可能需要将其导入foreach循环,例如:

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

146

使用这种方法应该比晚期过滤更快:

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

21
没问题。注:这个命令实际上会获取*.txt*这样的文件(-Filter使用CMD通配符)。如果这不是你想要的,那么请使用-Include *.txt。翻译为:这是正确的。一个注意事项:这个命令实际上会获取类似于*.txt*的文件(-Filter使用CMD通配符)。如果这不是您想要的,请使用-Include *.txt - Roman Kuzmin
假设别名ls=Get-ChildItem,使用ls | % { $_.FullName }命令可以在文件列表中获取完整路径。 - Mathieu CAROFF

49

您也可以像这样使用 Select-Object

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

7
请注意,“Select-Object”返回的是“PSCustomObject”,而不是字符串。如果您将结果用作另一个程序的参数,可能会出现问题。 - sad comrade
10
同意@Chintsu所说的。为了获得字符串而不是PSCustomObject,请使用-ExpandProperty FullName而不仅仅是FullName。据我了解,-ExpandProperty参数会导致cmdlet将结果作为指定属性的(本机?)类型返回,而不是作为某些自定义对象返回。 - doubleDown
我也需要时间(我搞乱了一个程序的源代码,后来想到应该从源控制开始,但我可以通过获取自安装以来的文件来获得我的第一次提交对“主”分支的想法:Get-ChildItem -Path 'C:\Program Files\TheProgram' -Recurse | Where-Object -FilterScript {($_.LastWriteTime -gt '2020-03-01')} | Select-Object FullName - Neil Gaetano Lindberg

32

这是一个更短的版本:

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

31
以下是翻译的结果: 这是一个更简短的命令: (gci -r c:\).fullname。 翻译意思为:获取"C:"盘符下所有文件和文件夹的完整路径。 - Chris N
19
这是一个更短的命令:(ls -r c:\).fullname。该命令会按逆序列出C盘中所有文件和目录,并显示它们的完整路径。 - Kalamane
26
这是一个更短的命令:(ls -r c:).fullname - Valiante

14

如果您需要相对路径,只需使用-Name标志。

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


这似乎没有给出相对路径,只有文件名。你能提供一个例子吗? - Omar Saad
2
如果文件在你开始的文件夹中,它只会显示文件名。如果它在子文件夹中,它将显示 subfolder/file.txt - Polymorphix
仅包含名称而非路径,不可获取文件的完整路径。 - diek
不,它提供相对路径,就像我的回答和之前的评论中所述。这并不完全是 OP 所要求的,但可以作为一个有用的补充。 - Polymorphix

8
我使用以下命令在"C:\Temp"中搜索".xlm"文件,并将结果打印到文件"result.txt"中:

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

在我的测试中,这种语法对我来说运行得非常好。

. FullName 就是我需要的! - Poat

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

我所使用的方法是如此。我认为这种方法更易于理解,因为它不包含任何循环语法。


7

试试这个:

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

2
请在您的尝试中添加一些信息,说明与其他尝试的不同之处以及为什么其他尝试没有成功。 - Uwe Allner

7

在PS 5中,一个非常让人恼火的问题是,在foreach中$_不会是完整的路径。这些是FileInfo和DirectoryInfo对象的字符串版本。由于某种原因,在路径中使用通配符可以解决此问题,或者使用Powershell 6或7。您还可以通过管道符号将其传递给get-item命令。

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

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

这似乎是.Net的一个问题,已经在.Net Core(PowerShell 7)中得到解决:自v6.0.2以来,FileInfo / Directory实例的字符串化行为发生了变化


5
这对我很有帮助,它可以生成一个名称列表。
$Thisfile=(get-childitem -path 10* -include '*.JPG' -recurse).fullname

我通过使用get-member -membertype properties命令找到了它,这是一个非常有用的命令。它提供的大多数选项都附带有一个.<thing>,比如这里的fullname。你可以使用相同的命令;

  | get-member -membertype properties 

在任何命令的结尾加上“--help”可以获取更多关于该命令的使用说明和访问方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接