我正在尝试运行一个显示带有双扩展名的文件的脚本,但问题是它显示的是所有文件,而不仅仅是带有双扩展名的文件。有没有办法做到这一点?
这就是我所拥有的:
Get-ChildItem -Path C:\Users\User\Downloads -filter *.txt.* -Recurse
这会显示所有txt文件以及带有额外.txt文件的文件(test.txt.txt)所以我试图只显示双txt扩展名。
希望我已经正确解释了这一点。
由于
答案 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))$"}
该子句匹配
的文件$_.Extension
将返回“.txt”。 -match
支持正则表达式,因此我们需要逃避这段时间以确保没有误报。 -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扩展名和带有点的名称。