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

5
我有一个带有大量目录和文件的驱动器,其中一些文件是损坏的,并且没有文件扩展名。我想删除所有没有扩展名的文件。我尝试过 "gci | where {$_.extension -eq ""} " 和 "gci | where {$_.extension -eq "."} ",以及这些变化,但最终得到了没有任何结果或者驱动器上的所有内容。
如果我查看 “gci | select Extension” 的结果,文件的扩展名显示为空,就像目录一样,不确定该怎么做。
如有帮助将不胜感激。
3个回答

11
gci -File -Recurse | ?{!($_.Extension)}

8

最简单和最快的解决方案(PSv3+)是使用-Filter参数

Get-ChildItem -File -Filter *.

此答案所述。

至于基于流水线的解决方案

PowerShell Core现在为简化的比较语句语法提供了-Not开关,该语法本身是在Windows PowerShell v3中引入到Where-Object(其内置别名为?)中的,这使得以下TheMadTechnician有用的答案的变体更加简洁:

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

正如TheMadTechnician的回答中所述,这使用了隐式布尔逻辑:任何非空字符串在布尔上下文中求值为$True,因此应用-Not意味着仅当字符串为空时才返回$True,即如果文件没有扩展名。
至于你尝试过的内容gci | where {$_.extension -eq ""}原则上是可行的,但它也包括目录
在PSv3+中,您可以使用-File开关来将结果限制为文件,如上所述。
PSv2中,您必须添加一个基于.PSISContainer属性的条件,该属性仅对目录返回$True
gci | where { -not $_.PSIsContainer -and $_.extension -eq "" }

1
多么精彩的解释啊!感谢您对我极其基础的回答进行了拓展。我真的需要回去完善我之前的回答,比如上面(或者根据未来的投票结果可能是下面)的那个,以提高质量。虽然在我的辩护中,我在写那篇文章之前只加入了SO两周。 - TheMadTechnician
我很感激你的好评,@TheMadTechnician。是的,在教人钓鱼的角度上非常重要,最简单的情况就是提供文档链接。但是,即使没有解释,一个可行的答案也比没有好,我明白反复解释某些事情可能会让人感到疲倦。 - mklement0

2
ls | where {!$_.PsIsContainer -and ![io.path]::hasextension($_.name) }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接