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

时间:2014-02-12 20:44:12

标签: powershell

我有一个包含大量目录和文件的驱动器,其中一些已损坏且没有文件扩展名。我想删除所有没有扩展名的文件。我尝试了gci | where {$_.extension -eq ""}gci | where {$_.extension -eq "."}以及其中的变体,但最终却没有在驱动器上获得任何内容或所有内容。

如果我查看gci | select Extension的结果,文件没有显示扩展名,就像目录一样,不知道该去哪里。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:4)

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

Get-ChildItem -File -Filter *.

this answer中所述。

关于基于管道的解决方案

PowerShell Core 现在为-Not开关提供了简化的比较语句语法,该语法本身已引入Where-Object(其内置别名)是Windows PowerShell v3中的?),它启用了TheMadTechnician's helpful answer的以下更简洁的变体:

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 "" }

答案 2 :(得分:1)

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