ユーザーの介入なしにディスククリーンアップを実行するPowerShellスクリプトファイルを開発しています。ユーザーは何も設定できません。
cleanmgr.exe /d c: sageset:1
を実行すると、クリーニングするファイル/フォルダーを選択するポップアップウィンドウが表示されます(クリーンアップオプション)。
これにより、クリーンアップオプションの設定を含むレジストリエントリが作成されます。その後、cleanmgr.exe /sagerun:1
を実行して、実際にクリーンアップを実行できます。
Powerhell /コマンドラインでクリーンアップオプションを直接指定する方法はありますか(削除するものを手動で選択する必要なし)?
私が見つけた唯一の解決策は、次のようにレジストリ値を手動で設定することです:
...
#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
...
次のPowershellスクリプトはCleanMgr.exeを自動化します。この場合、一時ファイルを削除し、更新クリーンアップ拡張機能を実行して、置き換えられたService Packバックアップファイルをパージします(Windows 10は、スケジュールされたタスクを介してこれを自動的に行います)。他の拡張機能を自動化するには、New-ItemProperty行で行われているように、対応するレジストリキーに「StateFlags0001」プロパティを作成します。レジストリキー名は、「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....'
}
cleanmgr /verylowdisk
を使用して、すべてのクリーンアップ手順をサイレントに自動化できます。
私は同じ問題に遭遇しました。可能性のある方法を調査して、私は以下を見つけました: http://stealthpuppy.com/cleaning-up-and-reducing-the-size-of-your-master-image/
Cmdを介してsagesetレジストリ設定を作成する方法を示します。その後、sagerun:#cmdを使用できます。私はまだスクリプトでそれを試していませんが、それが機能することを検証しました...
このスクリプトは、レジストリからすべてのボリュームキャッシュを取得し、それらを削除してすべてのキャッシュに対してCLEANMGR.EXEを実行できるようにします。
$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