删除包含字符串的文件

时间:2014-08-24 06:35:18

标签: powershell

如何使用powershell删除目录中包含字符串的所有文件?

我尝试过像

这样的事情
$list = get-childitem *.milk | select-string -pattern "fRating=2" | Format-Table Path
$list | foreach { rm $_.Path }

这适用于某些文件,但没有删除所有内容。我尝试了其他各种各样的东西,但没有任何工作。

我可以轻松获取文件名列表,只能使用

创建一个包含路径的数组
$lista = @(); foreach ($f in $list) { $lista += $f.Path; }

但似乎无法获得任何命令(delrmRemove-Item)。只需立即返回,不会删除文件或出错。

由于

5 个答案:

答案 0 :(得分:3)

首先,我们可以将您的代码简化为:

Get-ChildItem "*.milk" | Select-String -Pattern "fRating=2" | Select-Object -ExcludeProperty path | Remove-Item -Force -Confirm

缺少行动和错误可以通过以下两种方式之一解决。 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.

<强>更新

在测试中,我也遇到了类似的错误。经过研究,看起来像Select-String cmd-let一直保持文件阻止删除它。基于我的假设从未见过Get-ChildItem之前做过这个。在这种情况下的解决方案是将括号中的第一部分作为子表达式包含在内,以便在通过管道之前处理所有文件。

(Get-ChildItem | Select-String -Pattern "tes" | Select-Object -ExpandProperty path) | Remove-Item -Force -Confirm 

如果认为有必要,请删除-Confirm。它存在作为预防措施,因此您不会在c:\windows\system32中打开新的PowerShell并复制粘贴一个remove-item cmdlet。

另一次更新

[]是powershell中的通配符搜索,以便在您使用-Literalpath的某些cmdlet中转义这些搜索。此外Select-String可以在文件中返回多个匹配,因此我们应该使用-Unique

(Get-ChildItem *.milk | Select-String -Pattern "fRating=2" | Select-Object -ExpandProperty path -Unique) | ForEach-Object{Remove-Item -Force -LiteralPath $_}

答案 1 :(得分:0)

为什么使用select-string -pattern "fRating=2"?您想要选择具有此名称的所有文件吗? 我认为Format-Table Path不起作用。命令Get-ChildItem没有名为“Path”的属性 为你剪了这个工作?

$list = get-childitem *.milk | Where-Object -FilterScript {$_.Name -match "fRating=2"}
$list | foreach { rm $_.FullName }

答案 2 :(得分:0)

以下代码获取* .milk类型的所有文件并将它们放在$listA中,然后使用该列表获取包含字符串fRating=[01]的所有文件并将其存储在$listB中}。删除$listB中的文件,然后显示删除的文件数与包含匹配项的文件数(它们应相等)。

sv -name listA -value (Get-ChildItem *.milk); sv -name listB -value ($listA | Select-String -Pattern "fRating=[01]"); (($listB | Select-Object -ExpandProperty path) | ForEach-Object {Remove-Item -Force -LiteralPath $_}); (sv -name FCount -value ((Get-ChildItem *.milk).Count)); Write-Host -NoNewline Files Deleted ($listA.Count - $FCount)/($listB.Count)`n;

答案 3 :(得分:0)

无需复杂化:

FormsAuthenticationTicket ticket = FormsAuthenticationTicket.FromUtc(2, userName, utcNow, expirationUtc, createPersistentCookie, string.Empty, strCookiePath); string str = FormsAuthentication.Encrypt(ticket, hexEncodedTicket);

答案 4 :(得分:0)

我尝试了答案,不幸的是,错误总是会出现,但是,我设法创建了一个解决方案来完成此任务:

不使用Get-ChilItem;您可以直接使用select-string来搜索与某个字符串匹配的文件,是的,这将返回filename:count:content ...等,但是,在内部,这些名称可以选择或忽略,您需要的是要执行此操作的“文件名”,将其通过“选择对象”管道从输出中选择“文件名”。

因此,要选择所有具有“主题:Web服务重新启动”模式的* .MSG文件,您可以执行以下操作:

  

选择字符串-Path。*。MSG-模式'主题:WebServices重新启动'   -列表|选择对象文件名

另外,要即时删除这些文件,您可以使用RM命令将Foreach语句插入如下:

  

选择字符串-Path。*。MSG-模式'主题:WebServices重新启动'   -列表|选择对象文件名| foreach {rm $ _。FileName}

我自己尝试过,可以100%工作。

我希望这对您有帮助