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

问题描述:

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

这里是我有:

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

这显示所有的txt文件,以及一个额外的.txt(test.txt.txt)中的那些所以我想只显示双TXT延期。

希望我解释清楚。

感谢

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

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

可能-Filter慢,但它会得到你想要的东西,并具备递归(使用PowerShell V3.0 +)。尽管这只能涵盖你的txt文件。如果您想要提交全部加倍/重复的扩展文件,您可以使用where子句处理Get-ChildItem

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

该条款为

  1. 有一个扩展和
  2. 名称(不含扩展名)的文件匹配有上月底相同的扩展。例如,$_.Extension将返回“.txt”。 -match支持正则表达式,所以我们需要逃过那段时间以确保没有误报。

-File参数绝对是PS v3.0的一部分。这将返回在其全名结尾处具有双扩展名的所有文件。尾随$不被PowerShell解释为任何特殊的东西,因为它没有任何后面的字符会被混淆为变量。你可以逃脱`$,但这只是为了提醒美元符号的作用。在这里反向的存在并不会改变结果。

+0

谢谢,这个工作! – Newbie

文件实际上没有双扩展名,它们有一个扩展名,并且名称中带有点的文件。例如Appartment 1.04 in block ten - building report.txt将在您的报告中以双重扩展的形式出现,其名称为.04,其中包含第十块 - report.txt

所以:

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

将得到所有文件和筛选扩展名为.txt和名称与他们的点。

使用-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参数有一个主要的优点 - 它使底层文件系统提供者执行在源这使得过滤快得多 - 它有局限性和缺陷

  • 通配符模式语言是比PowerShell自己的更受限制的,具有传统的怪癖 - 请参阅this excellent answer背景信息。
    从本质上讲,只有*?支持,并.*或者只是.在模式的结尾空字符串匹配太(这是你有经验)。

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


在一个侧面说明,-Include-Exclude有自己的怪癖了。在这里,由于-Recurse-Include按预期工作;如果没有-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 

注意如何(一)cmd.exe仍然匹配,尽管外来尾随.字符,和(b)的.Name属性反映那些.字符。 - 即使.Extension.FullName都没有。

该问题已被举报here,但由于原因是底层GetFileAttributes原生Windows API函数的传统绑定行为,因此PowerShell中将不会解决此问题。

+0

感谢关联的问题。那是我永远找不到的。从来没有想过在这里寻找它。 – Matt

+0

@Matt:很高兴听到它有帮助;不幸的是,['Get-ChildItem'帮助主题](https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.management/get-childitem)如此紧张关于该主题,没有链接到其他信息:“过滤器的语法,包括使用通配符,取决于提供者。” – mklement0