Windows\Temp 大量 cab_XXXX 文件——无法删除

Windows\Temp 大量 cab_XXXX 文件——无法删除

关于这一点: Windows\Temp 大量的 cab_XXXX 文件

我无法删除文件。我正尝试执行移位删除,但其中随机分布着一些文件,它们被权限锁定了。

我尝试以管理员身份运行 powershell 但仍然出现权限问题。

有没有快速的方法可以批量删除其中的所有 cab_ 文件?

答案1

我喜欢人们引用我的答案。:)

首先尝试停止受信任的安装程序服务。

答案2

这可能是因为文件在正在运行的程序中打开。您可以尝试使用 Windows 中的磁盘清理实用程序来清理 Temp 文件夹。如果在线时不起作用,请尝试启动到安全模式并从那里删除它们。

答案3

我发现停止以下代码中的三个服务很有帮助。我最初用另一种语言编写了帮助文本,翻译起来很麻烦,但我添加了我为技术水平较低/不懂命令行的同事编写的相关 PowerShell 代码,以便从记事本/其他东西粘贴到 powershell.exe 中,并逐步运行,以半自动清理失控 cab 文件生成的计算机。我正在翻译我现在发现的最相关的部分。

当 CBSPersist 日志大小达到 1 或 2 GB 左右(我忘了是哪个,认为是后者)时,可能会发生这种情况,并且 makecab.exe 会尝试压缩它,失败,并且不会自行清理,并无限期地重复此操作。

我们通过使用 sysinternals 进程监视器来监视服务器,发现了这个问题。如果我没记错的话,这似乎是由 Windows 更新触发的。

这是代码,希望它能对某人有所帮助。

# Ensure we have a C:\temp. No output (necessary, but if you know what you're doing, you can tweak ... )
$TempDir = 'C:\temp'
if (-not (Test-Path -Path $TempDir -PathType Container)) { New-Item -ItemType Directory -Path $TempDir | Out-Null }
Set-Location -Path $TempDir

# Stop services. Lim inn disse tre linjene i powershell.exe og vent til den er ferdig.
# it could take a couple of minutes 
Stop-Service -Name TrustedInstaller
Stop-Service -Name wuauserv
Stop-Service -Name BITS


# Wait for makecab.exe to stop working, it seems to die by itself after 
# about a minute or three for me once you stop the services
# if you want something to look at while waiting for makecab.exe to die.
# you can also just look in task manager ...
$ProcessToCheck = 'makecab'
if (@(Get-Process -Name $ProcessToCheck -ErrorAction SilentlyContinue).Count -gt 0) {
    while (@(Get-Process -Name $ProcessToCheck -ErrorAction SilentlyContinue).Count -gt 0) {
        Write-Host -ForegroundColor Yellow "Waiting for ${ProcessToCheck}.exe to die ..."
        Start-Sleep 10
    }
}
else {
    Write-Host -ForegroundColor Green "${ProcessToCheck}.exe is not running at all (anymore)."
}
Write-Host -ForegroundColor Green "${ProcessToCheck}.exe died, so you can continue."

# Så skal vi slette cab_*_*-filene fra C:\Windows\Temp og vi er paranoide så vi vil se over
# filene først for å verifisere. Kan hoppes over hvis du er verdensvant og sikker, antar jeg.
# Lim inn alle disse linjene under i powershell.exe-vinduet og trykk enter (blank linje) til slutt.
# Eller marker i PowerShell ISE og trykk F8.
$TempCabFilesFile = "$TempDir\SIKT_Cab_Clean_temp.txt"
$TempCBSFilesFile = "$TempDir\SIKT_CBS_Clean_temp.txt"
Get-ChildItem -Path "${env:windir}\Temp\cab_*_*" |
    Select-Object LastWriteTime, @{n='Size (MB)'; e={[math]::Round(($_.Length / 1MB), 2)}}, FullName |
    Format-Table -AutoSize |
    Out-String -Width 1000 | 
    Set-Content -Encoding utf8 -Path $TempCabFilesFile
Get-ChildItem -Path "${env:windir}\Logs\CBS\cbspersi*.*" |
    Select-Object LastWriteTime, @{n='Size (MB)'; e={[math]::Round(($_.Length / 1MB), 2)}}, FullName |
    Format-Table -AutoSize |
    Out-String -Width 1000 |
    Set-Content -Encoding utf8 -Path $TempCBSFilesFile
notepad $TempCabFilesFile
notepad $TempCBSFilesFile

# inspect the files that pop up (merk at det ene notepad-vinduet kan havne bak andre ting)
# og sjekk at ikke noe som ikke skal slettes er med der.
# If all appears well, we run the code from before, but also delete
# sletter vi i tillegg.
# Det som skal slettes er filer med navn cab_1234_56 (vilkårlige tall) og
# CBSPersist_blabla.cab og -.log (.log kan være stor).

# Hvis du er superparanoid, så kan du kjøre disse og se over (fjern "#" først).
#Get-ChildItem -Path "${WinTempDir}\cab_*_*" | Remove-Item -WhatIf
#Get-ChildItem -Path "${env:windir}\Logs\CBS\cbspersi*.*" | Remove-Item -WhatIf

# This actually deletes the files! No output.
Get-ChildItem -Path "${env:windir}\Temp\cab_*_*" | Remove-Item
Get-ChildItem -Path "${env:windir}\Logs\CBS\cbspersi*.*" | Remove-Item

# Start the services again, and run a wuauclt /detectnow
# the latter sometimes fails, but it's not dangerous
Start-Service -Name TrustedInstaller
Start-Service -Name BITS
Start-Service -Name wuauserv
Start-Sleep 3
Start-Process -Wait -PassThru -FilePath wuauclt -ArgumentList '/detectnow'


#### Usually not necessary ####
# Try this if stuff appears broken. Can take a good while.
Start-Process -Wait -PassThru -FilePath sfc -ArgumentList '/scannow'

答案4

通过下载一个名为“Unlocker”的软件解决了这个问题,该软件允许您从内存中取消文件链接并将其删除。

相关内容