Je développe un fichier de script PowerShell qui doit exécuter un nettoyage de disque sans intervention de l'utilisateur. L'utilisateur ne peut rien configurer.
Lorsque je lance cleanmgr.exe /d c: sageset:1
, une fenêtre contextuelle apparaît pour sélectionner les fichiers/dossiers à nettoyer (options de nettoyage).
Cela créera une entrée de registre contenant les paramètres avec les options de nettoyage, puis vous pourrez exécuter cleanmgr.exe /sagerun:1
qui exécutera le nettoyage.
Existe-t-il un moyen de spécifier les options de nettoyage directement avec powerhell/ligne de commande (sans qu'il soit nécessaire de sélectionner manuellement les éléments à supprimer)?
La seule solution que j'ai trouvée consiste à définir manuellement les valeurs de registre comme suit:
...
#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
...
Le script Powershell suivant automatise CleanMgr.exe. Dans ce cas, il supprime les fichiers temporaires et exécute l'extension Update Cleanup pour purger les fichiers de sauvegarde Service Pack remplacés (Windows 10 le fait désormais automatiquement via une tâche planifiée). Pour automatiser d'autres extensions, créez une propriété "StateFlags0001" dans la clé de registre correspondante, comme indiqué dans les lignes New-ItemProperty. Vous trouverez les noms de clé de registre dans la branche "VolumeCaches".
En ce qui concerne le silence, ce script tente de démarrer CleanMgr.exe dans une fenêtre masquée. Cependant, à un moment donné, CleanMgr génère de nouveaux processus qui sont visibles et doivent être attendus séparément.
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....'
}
Vous pouvez utiliser cleanmgr /verylowdisk
pour automatiser en silence toutes les étapes de nettoyage.
J'ai rencontré le même problème. En recherchant les moyens possibles, j’ai trouvé ce qui suit: http://stealthpuppy.com/cleaning-up-and-reducing-the-size-of-your-master-image/
Il montre comment créer les paramètres de registre de sageset via cmd. Vous pouvez ensuite utiliser le sagerun: # cmd. Je n'ai pas encore essayé via le script, mais j'ai validé que cela fonctionne ...
Ce script récupère tous les caches de volume du registre, leur permet d'être nettoyés et exécute le fichier CLEANMGR.EXE pour tous les caches.
$VolumeCachesRegDir = "hklm:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches"
$CacheDirItemNames = Get-ItemProperty "$VolumeCachesRegDir\*" | select -ExpandProperty PSChildName
$CacheDirItemNames |
%{
$exists = Get-ItemProperty -Path "$VolumeCachesRegDir\$_" -Name "StateFlags6553" -ErrorAction SilentlyContinue
If (($exists -ne $null) -and ($exists.Length -ne 0))
{
Set-ItemProperty -Path "$VolumeCachesRegDir\$_" -Name StateFlags6553 -Value 2
}
else
{
New-ItemProperty -Path "$VolumeCachesRegDir\$_" -Name StateFlags6553 -Value 0 -PropertyType DWord
}
}
Start-Sleep -Seconds 3
Write-Host 'Running CleanMgr.exe...'
Start-Process -FilePath CleanMgr.exe -ArgumentList '/sagerun:65535' -WindowStyle Hidden -PassThru
cls