如何只显示双扩展文件而不是所有文件?

时间:2017-02-23 19:36:22

标签: powershell

我正在尝试运行一个显示带有双扩展名的文件的脚本,但问题是它显示的是所有文件,而不仅仅是带有双扩展名的文件。有没有办法做到这一点?

这就是我所拥有的:

Get-ChildItem -Path C:\Users\User\Downloads -filter *.txt.* -Recurse

这会显示所有txt文件以及带有额外.txt文件的文件(test.txt.txt)所以我试图只显示双txt扩展名。

希望我已经正确解释了这一点。

由于

3 个答案:

答案 0 :(得分:2)

正在寻找官方文档,因为Get-ChildItem的MSDN没有具体内容。 mklement0 links to an answer that covers this如果你把它放到路径中,你会得到你正在寻找的结果。

Get-ChildItem -Path "C:\Users\User\Downloads\*.txt.*"

可能-Filter慢,但它会得到你想要的东西,并以递归方式工作(在PowerShell v3.0 +中)。这只包括你的txt文件。如果您想要提交所有加倍/重复的扩展文件,您可以使用Get-ChildItem条款对where进行过帐处理。

Get-ChildItem -Path "C:\Users\User\Downloads" -Recurse -File | 
    Where-Object{$_.Extension -and $_.BaseName -match "$([regex]::Escape($_.Extension))$"} 

该子句匹配

的文件
  1. 有分机和
  2. 名称(没有扩展名)在末尾有相同的扩展名。例如,$_.Extension将返回“.txt”。 -match支持正则表达式,因此我们需要逃避这段时间以确保没有误报。
  3. -File参数绝对是PS v3.0的一部分。这将返回在其全名结尾处具有双重扩展名的所有文件。 PowerShell不会将尾随$解释为任何特殊内容,因为它后面没有任何字符会被混淆为变量。你可以逃脱`$,但这只是为了提醒美元符号的用途。这种反引号的存在并不会改变这种情况下的结果。

答案 1 :(得分:2)

使用-Include 而不是-Filter,这会使通配符模式按预期工作:

Get-ChildItem -Path C:\Users\User\Downloads -Recurse -Include *.txt.*

注意:这会匹配文件名中任意位置.txt. 的文件,包括foo.txt.csv或"三重扩展程序"文件,例如foo.txt.txt.txt
*.txt.txt只会生成 .txt.txt结尾的文件名,这些文件名仍包含三个或更多.txt个 - 扩展名文件名。
请注意,*.txt.txt也适用于-Filter

虽然 -Filter参数有一个主要优势 - 它使底层文件系统提供程序在源执行过滤,这使得更快< / strong> - 它有限制和陷阱

  • 通配符模式语言更受限制比PowerShell更具限制具有传统怪癖 - 请参阅this excellent answer了解背景信息。
    从本质上讲,仅支持*?,并且模式末尾的.*或仅. 匹配为空字符串(这是你经历过的)。

  • 您只能将单个通配符模式传递给-Filter,而-Include支持多个。

在旁注中,-Include-Exclude也有他们的怪癖。在此处-Include由于-Recurse而按预期工作;如果没有-Recurse,您必须在-Path中使\*值结束才能生效。

或者,如果您只需要单个通配符模式,则可以直接将该模式附加到路径 - C:\Users\User\Downloads\*.txt.* - 如Matt's helpful answer中所示。<登记/> 但是,需要注意的是,-Recurse只能在PSv3或更高版本中使用; 相比之下,PSv2仅将模式应用于直接孩子

在相关但又截然不同的说明中,TessellatingHeckler在指定以.字符结尾的文字路径时发现了一种奇怪的现象。 (至少从PSv2开始,至今仍然是PSv5.1):

> Get-Item -LiteralPath c:\windows\system32\cmd.exe... | Format-List Name, Extension

Name      : cmd.exe...
Extension : .exe

注意(a)cmd.exe仍然匹配,尽管有无关的追踪.字符,以及(b).Name属性反映了那些.字符。 - 即使.Extension.FullName都没有。

已报告此问题here,但由于原因是基础GetFileAttributes本机Windows API函数的遗留绑定行为,因此无法在PowerShell中解决此问题。

答案 2 :(得分:0)

文件不具有双重扩展名,它们有一个扩展名,并且您的名称中包含带点的文件。例如Appartment 1.04 in block ten - building report.txt将在您的报告中作为第10块中名为 .04的双重扩展名出现 - 构建report.txt

所以:

Get-ChildItem -Path C:\Users\User\Downloads -Recurse | Where {$_.Extension -eq '.txt' -and $_.BaseName -match '\.' }

将获取所有文件并过滤.txt扩展名和带有点的名称。