我的驱动器包含大量目录和文件,其中一些已损坏并且没有文件扩展名。 我想删除所有没有扩展名的文件。 我尝试过
gci | where {$_.extension -eq ""}
和 gci | where {$_.extension -eq "."}
以及它们的变体,但最终在驱动器上什么也没有得到。
如果我查看
gci | select Extension
的结果,文件没有显示任何扩展名,就像一个目录,不知道该去哪里。
如有任何帮助,我们将不胜感激。
gci -File -Recurse | ?{!($_.Extension)}
最简单、最快的解决方案(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 "" }
ls | where {!$_.PsIsContainer -and ![io.path]::hasextension($_.name) }