如何使用powershell选择没有扩展名的文件

问题描述 投票:0回答:3

我的驱动器包含大量目录和文件,其中一些已损坏并且没有文件扩展名。 我想删除所有没有扩展名的文件。 我尝试过

gci | where {$_.extension -eq ""}
gci | where {$_.extension -eq "."}
以及它们的变体,但最终在驱动器上什么也没有得到。

如果我查看

gci | select Extension
的结果,文件没有显示任何扩展名,就像一个目录,不知道该去哪里。

如有任何帮助,我们将不胜感激。

powershell
3个回答
11
投票
gci -File -Recurse | ?{!($_.Extension)}

9
投票

最简单、最快的解决方案(PSv3+)是使用

-Filter
参数

Get-ChildItem -File -Filter *.

此答案中所述。

至于基于管道的解决方案

PowerShell(核心)7 现在提供带有简化比较语句语法的

-Not
开关,该语法本身已引入 Windows PowerShell v3 中的
Where-Object
(其内置别名为
?
),这启用以下更简洁的变体 TheMadTechnician 的有用答案

Get-ChildItem -File | Where-Object -Not Extension

正如TheMadTechnician的答案一样,这使用了隐式布尔逻辑:任何非空字符串在布尔上下文中都会计算为

$True
,因此应用
-Not
意味着仅当字符串
空时才返回$True,即,如果文件没有扩展名。


至于你尝试过的

gci | where {$_.extension -eq ""}
原则上可以工作,只不过它还包含 目录

在 PSv3+ 中,您可以使用

-File
开关将结果限制为 files,如上所述。

PSv2 中,您必须向脚本块添加一个条件,基于

.PSISContainer
属性,仅针对
目录
返回 $True

gci | where { -not $_.PSIsContainer -and $_.extension -eq "" }

2
投票
ls | where {!$_.PsIsContainer -and ![io.path]::hasextension($_.name) }
© www.soinside.com 2019 - 2024. All rights reserved.