获取PowerShell中文件的完整路径

时间:2012-10-29 16:55:45

标签: powershell powershell-v2.0

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

我正在做这样的事情,使用Get-ChildItem

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

但是,它只返回文件名而不是整个路径。

14 个答案:

答案 0 :(得分:173)

| select FullName添加到上一行的末尾。如果您之后需要实际执行某些操作,则可能需要将其传递到foreach循环中,如下所示:

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

答案 1 :(得分:82)

这应该比使用后期过滤快得多:

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

答案 2 :(得分:19)

你也可以这样使用Select-Object

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

答案 3 :(得分:13)

这是一个较短的一个:

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

答案 4 :(得分:8)

如果你想要相对路径,你可以使用-Name标志。

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

答案 5 :(得分:4)

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

这就是我用过的东西。我觉得它更容易理解,因为它不包含任何循环语法。

答案 6 :(得分:2)

这对我有用,并产生一个名单:

$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

答案 7 :(得分:1)

试试这个:

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

答案 8 :(得分:1)

[替代语法]

对于某些人来说,定向管道操作员不是他们的品味,但他们更喜欢链接。请参阅roslyn问题跟踪器中分享的有关此主题的一些有趣观点:dotnet/roslyn#5445

根据案例和背景,这种方法之一可以被认为是隐含的(或间接的)。例如,在这种情况下,对可枚举使用管道需要特殊标记$_(又名PowerShell's "THIS" token)可能对某些人来说是令人反感的。

对于这样的人来说,这是一个更简洁,直接的方式来做点链

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

(&lt; rant&gt;请注意,PowerShell的命令参数解析器接受部分参数名称。除了-recursive; -recursiv-recursi-recurs之外,-recur-recu-rec-re被接受,但遗憾的是-r ..这是唯一正确选择单- Get-InstalledModule 1}}字符(如果我们通过POSIXy UNIXy约定)!&lt; / rant&gt;)

答案 9 :(得分:1)

在PS 5中确实很烦人,其中$ _不会是foreach中的完整路径。这些是FileInfo和DirectoryInfo对象的字符串版本。出于某种原因,路径中的通配符可以解决该问题,或使用PS6。您也可以通过管道将其通入get-item。

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

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

答案 10 :(得分:0)

我正在使用以下脚本扩展所有文件夹路径:

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...

答案 11 :(得分:0)

我使用此行命令在“ C:\ Temp”中搜索“ .xlm”文件,结果在“ result.txt”文件中打印了全名路径:

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

在我的测试中,此语法对我来说很漂亮。

答案 12 :(得分:0)

为什么还没有人使用过foreach循环?这里的一个优点是您可以轻松命名变量:

{{1}}

答案 13 :(得分:0)

我遇到了一个问题,我有一个可执行文件,该文件将目录路径字符串作为参数和格式。像这样:

"C:\temp\executable.exe" "C:\storage\filename" "C:\storage\dump" -jpg

我需要在不同文件夹中的 TB 级 .jpg 文件中执行此命令。

$files = Get-ChildItem  -Path C:\storage\*.jpg -Recurse -Force | Select-Object -ExpandProperty FullName

for ($i=0; $i -lt $files.Count; $i++) {
    [string]$outfile = $files[$i]
    
    Start-Process -NoNewWindow -FilePath "C:\temp\executable.exe" -ArgumentList $outfile, "C:\storage\dump", "-dcm"
   

}