如何仅显示双扩展名文件而不是所有文件?
我想运行一个脚本,将显示带有双扩展名的文件,但问题是它显示所有文件而不是双扩展名的文件。有没有办法做到这一点?如何仅显示双扩展名文件而不是所有文件?
这里是我有:
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))$"}
该条款为
- 有一个扩展和
- 名称(不含扩展名)的文件匹配有上月底相同的扩展。例如,
$_.Extension
将返回“.txt”。-match
支持正则表达式,所以我们需要逃过那段时间以确保没有误报。
-File
参数绝对是PS v3.0的一部分。这将返回在其全名结尾处具有双扩展名的所有文件。尾随$
不被PowerShell解释为任何特殊的东西,因为它没有任何后面的字符会被混淆为变量。你可以逃脱`$
,但这只是为了提醒美元符号的作用。在这里反向的存在并不会改变结果。
文件实际上没有双扩展名,它们有一个扩展名,并且名称中带有点的文件。例如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中将不会解决此问题。
谢谢,这个工作! – Newbie