我有一个包含大量目录和文件的驱动器,其中一些已损坏且没有文件扩展名。我想删除所有没有扩展名的文件。我尝试了gci | where {$_.extension -eq ""}
和gci | where {$_.extension -eq "."}
以及其中的变体,但最终却没有在驱动器上获得任何内容或所有内容。
如果我查看gci | select Extension
的结果,文件没有显示扩展名,就像目录一样,不知道该去哪里。
任何帮助都将不胜感激。
答案 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) }