使用Powershell删除特定名称的子文件夹

5

我刚接触PowerShell,一直在尝试编写脚本,但是到目前为止,一直没有成功。我想让它执行一个特定任务,即:

我需要能够搜索驱动器中名为"Cookies"的特定文件夹并将其删除。问题在于该文件夹Cookies位于多个位置。

例如:

\\\myserver\test\User\Profiles\USER1\AppData\Roaming\Microsoft\Windows\Cookies
\\\myserver\test\User\Profiles\USER2\AppData\Roaming\Microsoft\Windows\Cookies
\\\myserver\test\User\Profiles\USER3\AppData\Roaming\Microsoft\Windows\Cookies
\\\myserver\test\User\Profiles\USER4\AppData\Roaming\Microsoft\Windows\Cookies

我该如何让PowerShell遍历所有不同的用户文件夹以搜索Cookies文件夹并删除它。

我想到了以下方法,但希望有PowerShell大师能够帮助我。

$cookies= Get-ChildItem \\myserver\test\User\Profiles\*\AppData\Roaming\Microsoft\Windows\Cookies

foreach ($cookie in $cookies){
    Remove-Item "$cookies" -Force -Recurse -ErrorAction SilentlyContinue   
}

这个能行吗?

3个回答

6

你已经快完成了,不需要在$cookies周围使用引号。

如果你使用foreach ($cookie in $cookies),那么在脚本块中操作$cookie,而不是$cookies

这样做是有效的:

$cookies = Get-ChildItem \\myserver\test\User\Profiles\*\AppData\Roaming\Microsoft\Windows\Cookies

foreach ($cookie in $cookies){
    Remove-Item $cookie -Force -Recurse -ErrorAction SilentlyContinue   
}

但是这样也可以工作,而不需要循环:
$cookies = Get-ChildItem \\myserver\test\User\Profiles\*\AppData\Roaming\Microsoft\Windows\Cookies
Remove-Item $cookies -Force -Recurse -ErrorAction SilentlyContinue

如果你想要一行代码且没有变量:

Get-ChildItem \\myserver\test\User\Profiles\*\AppData\Roaming\Microsoft\Windows\Cookies | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue

@Roy 如果可能的话,始终优先使用管道(最后一个示例)进行工作。 - marsze
@Hoi Gert Jan,谢谢您,但我们的安全管理员想对代码进行一些小改动。就是从Cookie文件夹中删除60天前的.txt文件,但我遇到了内存错误。get-item -path D:\User\Profiles\*\AppData\Roaming\Microsoft\Windows\Cookies\* -filter "*.txt" -force | Where-Object {$_.LastWriteTime -lt (get-date).addDays(-60) } - Roy
@Roy,你的代码看起来还不错。那里有很多cookie文件需要收集吗? - Gert Jan Kraaijeveld
做得很好,不过你应该使用 Remove-Item $cookie.FullName,因为隐含的 -Path 参数(对于 -LiteralPath 也是如此)将其参数绑定为一个 _字符串_,而在 Windows PowerShell 中,Get-ChildItem特定情况下 字符串化为 _纯文件名_,这会导致命令失败或更糟糕的是删除错误的项目。虽然在这个特定的 Get-ChildItem 调用中不会发生这种情况,但总是在传递 Get-ChildItem / Get-Item 作为 参数 时使用 .FullName 是一个好习惯(管道输入不受影响)。请参见 https://dev59.com/pa_la4cB1Zd3GeqP0vKJ#53400031 获取更多信息。 - mklement0
是的,我有大约700个用户,每个用户都有大约4000个或更多的cookies... - Roy
@Roy 确保不要将所有这些对象存储在变量中,而是使用适当的管道化过程,例如上面的一行代码。 - Gert Jan Kraaijeveld

0

试试这个一行代码 -

$path = "\\myserver\test\User\Profiles\"
Get-ChildItem $path -Recurse -Directory | Where-Object {$_.Name -eq 'Cookies'} | % {Remove-Item $_.FullName}

让我试一下,我会随时通知你的。 - Roy
嗨,Vivek,我稍微改了一下代码,因为我们想要一个代码删除那些是.txt文件并且需要超过60天的cookie文件。get-item -path D:\User\Profiles\*\AppData\Roaming\Microsoft\Windows\Cookies\* -filter "*.txt" -force | Where-Object {$_.LastWriteTime -lt (get-date).addDays(-60) }但现在我遇到了内存错误。 - Roy

0

这是一个简化版。为了安全起见,我建议先使用-WhatIf运行它,以验证结果是否正确。然后只需注释掉另一行即可。

$path = ""
$pattern = ""
Get-ChildItem $path -recurse -directory -include $pattern |
   Remove-Item -WhatIf
   #Remove-Item -Force -ErrorAction SilentlyContinue

嗨Bakudan,谢谢你的快速回复。由于我们的安全管理员希望删除60天之前的Cookies文件夹中的.txt文件,所以我不得不稍微更改了一下代码。但现在我遇到了内存错误。get-item -path D:\ User \ Profiles \ * \ AppData \ Roaming \ Microsoft \ Windows \ Cookies \ * -filter“*. Txt”-force | Where-Object {$_.LastWriteTime -lt(get-date).addDays(-60)} - Roy
@Roy,我没有看到过这样的错误,所以无法帮助你解决。至于关于60天以上的cookie问题,最好更新一下你的问题。 - Bakudan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接