如何使用powershell删除包含字符串的目录中的所有文件?
我试过类似的东西
$list = get-childitem *.milk | select-string -pattern "fRating=2" | Format-Table Path
$list | foreach { rm $_.Path }
Run Code Online (Sandbox Code Playgroud)
这适用于某些文件,但并未删除所有文件。我尝试了其他各种事情,但没有任何效果。
我可以轻松获取文件名列表,并可以创建一个仅使用路径的数组
$lista = @(); foreach ($f in $list) { $lista += $f.Path; }
Run Code Online (Sandbox Code Playgroud)
但似乎无法获得任何命令 ( del, rm, 或Remove-Item) 来执行任何操作。只需立即返回而不删除文件或给出错误。
谢谢
首先,我们可以将您的代码简化为:
Get-ChildItem "*.milk" | Select-String -Pattern "fRating=2" | Select-Object -ExcludeProperty path | Remove-Item -Force -Confirm
Run Code Online (Sandbox Code Playgroud)
缺乏行动和错误可能可以通过两件事之一来解决。其中的Force参数:
允许 cmdlet 删除不能以其他方式更改的项目,例如隐藏或只读文件或只读别名或变量。
我还建议您以管理员身份运行此脚本。根据这些文件所在的位置,您可能没有权限。如果不是这种情况或不起作用,请包括您遇到的错误。
我要猜测错误是:
remove-item : Cannot remove item C:\temp\somefile.txt: The process cannot access the file 'C:\temp\somefile.txt'
because it is being used by another process.
Run Code Online (Sandbox Code Playgroud)
更新
在测试中,我也遇到了类似的错误。经过研究,看起来 Select-String cmd-let 保留了文件以防止其被删除。基于我以前从未见过 Get-ChildItem 这样做的假设。在这种情况下,解决方案是将 this 的第一部分括在括号中作为子表达式,以便在通过管道之前处理所有文件。
(Get-ChildItem | Select-String -Pattern "tes" | Select-Object -ExpandProperty path) | Remove-Item -Force -Confirm
Run Code Online (Sandbox Code Playgroud)
-Confirm如果认为需要,请删除。它作为预防措施存在,这样您就不会在其中打开新的 powershellc:\windows\system32并在其中复制粘贴 remove-item cmdlet。
另一个更新
[并且]是 powershell 中的通配符搜索,以便转义您使用的某些 cmdlet 中的那些-Literalpath。也Select-String可以在文件中返回多个命中,所以我们应该使用-Unique
(Get-ChildItem *.milk | Select-String -Pattern "fRating=2" | Select-Object -ExpandProperty path -Unique) | ForEach-Object{Remove-Item -Force -LiteralPath $_}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12198 次 |
| 最近记录: |