Автоматизировать процесс очистки диска cleanmgr.exe без вмешательства пользователя

Я разрабатываю файл сценария powershell, который должен выполнить некоторую очистку диска без вмешательства пользователя. Пользователь не сможет ничего настроить.

когда я запускаю cleanmgr.exe /d c: sageset:1 появится всплывающее окно для выбора файлов / папок для очистки(параметры очистки).

это создаст запись реестра, содержащую настройки с параметрами очистки, и после этого вы можете запустить cleanmgr.exe /sagerun:1 который фактически выполнит очистку.

есть ли способ укажите параметры очистки непосредственно с помощью powerhell / командной строки (без необходимости вручную выбирать удаляемые объекты)?

4 ответов


следующий сценарий Powershell автоматизирует CleanMgr.исполняемый. В этом случае он удаляет временные файлы и запускает расширение Update Cleanup для очистки замененных файлов резервных копий пакета обновления (Windows 10 теперь делает это автоматически через запланированную задачу). Для автоматизации других расширений создайте свойство "StateFlags0001" в соответствующем разделе реестра, как это сделано в строках New-ItemProperty. Вы найдете имена разделов реестра в ветке "VolumeCaches".

Как тихий, этот скрипт пытается запустить CleanMgr.exe в скрытом окне. Однако в какой-то момент CleanMgr порождает новые процессы, которые видны и должны обслуживаться отдельно.

Write-Host 'Clearing CleanMgr.exe automation settings.'
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\*' -Name StateFlags0001 -ErrorAction SilentlyContinue | Remove-ItemProperty -Name StateFlags0001 -ErrorAction SilentlyContinue

Write-Host 'Enabling Update Cleanup. This is done automatically in Windows 10 via a scheduled task.'
New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Update Cleanup' -Name StateFlags0001 -Value 2 -PropertyType DWord

Write-Host 'Enabling Temporary Files Cleanup.'
New-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Temporary Files' -Name StateFlags0001 -Value 2 -PropertyType DWord

Write-Host 'Starting CleanMgr.exe...'
Start-Process -FilePath CleanMgr.exe -ArgumentList '/sagerun:1' -WindowStyle Hidden -Wait

Write-Host 'Waiting for CleanMgr and DismHost processes. Second wait neccesary as CleanMgr.exe spins off separate processes.'
Get-Process -Name cleanmgr,dismhost -ErrorAction SilentlyContinue | Wait-Process

$UpdateCleanupSuccessful = $false
if (Test-Path $env:SystemRoot\Logs\CBS\DeepClean.log) {
    $UpdateCleanupSuccessful = Select-String -Path $env:SystemRoot\Logs\CBS\DeepClean.log -Pattern 'Total size of superseded packages:' -Quiet
}

if ($UpdateCleanupSuccessful) {
    Write-Host 'Rebooting to complete CleanMgr.exe Update Cleanup....'
    SHUTDOWN.EXE /r /f /t 0 /c 'Rebooting to complete CleanMgr.exe Update Cleanup....'
}

Я столкнулся с такой же проблемой. Исследуя возможные пути, я обнаружил следующее: : http://stealthpuppy.com/cleaning-up-and-reducing-the-size-of-your-master-image/

Он показывает, как создать параметры реестра sageset с помощью cmd. Затем вы можете использовать sagerun:# cmd. Я еще не пробовал его через скрипт, но подтвердил, что он работает...


единственное решение, которое я нашел, - вручную установить значения реестра следующим образом:

...

#Set StateFlags0012 setting for each item in Windows 8.1 disk cleanup utility
if  (-not (get-itemproperty -path 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Active Setup Temp Folders' -name StateFlags0012 -ErrorAction SilentlyContinue)) {
set-itemproperty -path 'HKLM:\Software\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Active Setup Temp Folders' -name StateFlags0012 -type DWORD -Value 2
set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\BranchCache' -name StateFlags0012 -type DWORD -Value 2
set-itemproperty -path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Downloaded Program Files' -name StateFlags0012 -type DWORD -Value 2

...

посмотреть полный пример


можно использовать cleanmgr /verylowdisk чтобы автоматически автоматизировать все шаги очистки.