web-dev-qa-db-ja.com

Windows \ Temp大量のcab_XXXXファイル-削除できません

これに関して: Windows\Temp大量のcab_XXXXファイル

ファイルを削除できません。シフト削除を実行しようとしていますが、アクセス許可によってロックアウトされているファイルがランダムに散在しています。

管理者としてPowerShellを実行しようとしましたが、それでもアクセス許可の問題が発生しました。

そこにあるすべてのcab_ファイルを一括削除する簡単な方法はありますか?

1
Jason

人々が私の答えを参照するとき、私は大好きです。 :)

最初に信頼できるインストーラーサービスを停止してみてください。

2
Tim Brigham

以下のコードで3つのサービスを停止すると役立つことがわかりました。私は元々別の言語でヘルプテキストを書いたので、翻訳するのは面倒ですが、技術的ではない/コマンドラインに精通していない同僚がメモ帳などからpowershell.exeに貼り付けるために作成した適切なPowerShellコードを追加しています。ステップバイステップで実行して、暴走したcabファイルを生成するコンピューターのクリーンアップを半自動化します。私は今見つけた最も適切な部分を翻訳しています。

これは、CBSPersistログが約1GBまたは2GB大きくなり(どちらかを忘れた、後者だと思います)、makecab.exeがログを圧縮しようとして失敗し、その後クリーンアップしない場合に発生する可能性があります。このアクションを無期限に繰り返します。

これは、sysinternalsプロセスモニターでサーバーを監視することで発見されました。私が正しく覚えていれば、これはWindowsUpdateによってトリガーされたようです。

これがコードです、それが誰かを助けることを願っています。

# 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'
1
Joakim

実行中のプログラムでファイルが開いていることが原因である可能性があります。 Windowsのディスククリーンアップユーティリティを使用して、Tempフォルダをクリーンアップしてみてください。オンラインで機能しない場合は、セーフモードで起動して、そこから削除してみてください。

1
Joe