Powershell 如何仅显示双扩展名文件而不是所有文件?
我正在尝试运行一个脚本,该脚本将显示具有双扩展名的文件,但问题是它显示所有文件,而不仅仅是具有双扩展名的文件。有没有办法做到这一点 以下是我所拥有的:Powershell 如何仅显示双扩展名文件而不是所有文件?,powershell,Powershell,我正在尝试运行一个脚本,该脚本将显示具有双扩展名的文件,但问题是它显示所有文件,而不仅仅是具有双扩展名的文件。有没有办法做到这一点 以下是我所拥有的: Get-ChildItem -Path C:\Users\User\Downloads -filter *.txt.* -Recurse 这将显示所有的txt文件以及带有额外的.txt(test.txt.txt)的文件,所以我尝试只显示双txt扩展名 希望我已经解释清楚了 感谢寻找官方文档,因为MSDN上没有关于Get ChildItem的具体
Get-ChildItem -Path C:\Users\User\Downloads -filter *.txt.* -Recurse
这将显示所有的txt文件以及带有额外的.txt(test.txt.txt)的文件,所以我尝试只显示双txt扩展名
希望我已经解释清楚了
感谢寻找官方文档,因为MSDN上没有关于
Get ChildItem
的具体内容。如果你把它放在路径中,你会得到你想要的结果
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))$"}
该子句与以下文件匹配:
-match
支持正则表达式,因此我们需要避开该周期以确保没有误报李>
-File
参数绝对是PS v3.0的一部分。这将返回在其全名末尾具有双扩展名的所有文件。PowerShell不会将尾随的$
解释为任何特殊字符,因为它后面没有任何可能会混淆为变量的字符。您可以转义“$”,但这只是为了提醒您美元符号的用途。在本例中,反勾号的存在不会改变结果 文件实际上没有双扩展名,它们只有一个扩展名,而文件名中有点。e、 g.block ten-building report.txt中的公寓1.04将作为block ten-building report.txt中名为.04的双扩展名出现在您的报告中
因此:
将获取所有文件和filter.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
也可以与-Filter
一起使用
虽然-Filter
参数有一个主要的优点-它使底层文件系统提供程序在源代码处执行过滤,从而使其更快-它有限制和陷阱:
- 通配符模式语言比PowerShell自己的语言更为有限,有一些遗留的怪癖-请参阅以获取背景信息
- 本质上,只支持
*
和?
(不支持字符集/范围表达式,如[0-9]
),并且模式末尾的*
或仅
也匹配空字符串(这是您所经历的)
- 在Windows PowerShell中(在PowerShell[Core]6+中不再是问题),也会意外地对通常隐藏的短(8.3)文件名执行匹配,这意味着类似
*.xls
的内容意外地表现为类似*.xls*
的行为,并且还匹配.xlsx
文件
- 您只能将一个通配符模式传递给
-Filter
,而-Include
支持多个通配符模式
另一方面,-Include
和-Exclude
也有它们的怪癖。这里,-Include
由于-Recurse
而按预期工作如果没有-Recurse
,则必须使-Path
值以\*
结尾,才能使其工作-请参阅
或者,如果您只需要一个通配符模式,您可以直接将该模式附加到路径-C:\Users\User\Downloads\*.txt.
,如中所示。
但是,需要注意的是,对于-Recurse
,这只适用于PSv3或更高版本
相比之下,PSv2仅将模式应用于直接子代
在一个相关但不同的注释中,当指定以
字符结尾的文本路径时,发现了一个奇怪之处。(至少从PSv2开始出现,直到PSv5.1为止):
请注意(a)cmd.exe
如何仍然匹配,尽管后面有多余的
字符,.Name
属性反映了这些
字符。-即使.Extension
和.FullName
都没有
已报告此问题,但由于原因是基础GetFileAttributes
本机Windows API函数的旧版绑定行为,因此此问题将无法在PowerShell中解决。感谢您提出的链接问题。那是我永远找不到的。我从来没想到在这里找过。@Matt:很高兴听到它有帮助;不幸的是,对于这个主题,作者三缄其口,没有附加信息的链接:“过滤器的语法,包括通配符的使用,取决于提供者。”
Get-ChildItem -Path C:\Users\User\Downloads -Recurse -Include *.txt.*
PS> Get-Item -LiteralPath c:\windows\system32\cmd.exe... | Format-List Name, Extension
Name : cmd.exe...
Extension : .exe