Disk Cleanup cleanmgr 프로세스를 자동화합니다.사용자의 개입 없이 실행
사용자의 개입 없이 디스크 정리를 실행할 수 있는 파워셸 스크립트 파일을 개발 중입니다.사용자는 아무것도 구성할 수 없습니다.
가 실행할 때cleanmgr.exe /d c: sageset:1
치료할 파일/폴더를 선택할 수 있는 팝업 창이 나타납니다(선택사항 선택).
옵션이 이후에는 하여 을 하는 이 되고 에는 할 을 할 에는 되고 cleanmgr.exe /sagerun:1
실제로 정리를 실행할 수 있습니다.
삭제할 항목을 수동으로 선택할 필요 없이 파워셸/명령줄로 직접 정리 옵션을 지정할 수 있는 방법이 있습니까?
다음 Powershell 스크립트는 CleanMgr.exe를 자동화합니다.이 경우 임시 파일을 제거하고 Update Cleanup 확장자를 실행하여 대체된 서비스 팩 백업 파일을 제거합니다(Windows 10에서는 예약된 작업을 통해 이 작업을 자동으로 수행함).다른 확장을 자동화하려면 New-ItemProperty 행에서와 같이 해당 Registry 키에 "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....'
}
이며 에 PowerShell 은 하거나 할 이며 되는 은 에 되는 할 sageset
옵션이 모두 선택되어 있고 사용자 상호 작용이 필요하지 않습니다.이것은 이 게시물의 여러 답변과 댓글에서 영감을 얻었습니다.
참고: 여러 원격 및 로컬 Windows 10 시스템에서 특별히 문제 없이 필요에 맞게 조정하고 성공적으로 사용했습니다.
로컬 시스템에서 실행
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\*' | % {
New-ItemProperty -Path $_.PSPath -Name StateFlags0001 -Value 2 -PropertyType DWord -Force
};
Start-Process -FilePath CleanMgr.exe -ArgumentList '/sagerun:1' ##-WindowStyle Hidden
원격 시스템에서 실행
$cred = Get-Credential "domain\administrator";
Invoke-Command -ComputerName "computer004" {
Process {
Get-ItemProperty -Path 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\*' | % {
New-ItemProperty -Path $_.PSPath -Name StateFlags0001 -Value 2 -PropertyType DWord -Force
};
Start-Process -FilePath CleanMgr.exe -ArgumentList '/sagerun:1' -WindowStyle Hidden
}
} -AsJob -Credential $cred
지원 리소스
-
-AsJob
Run the command as a background job on a remote computer. Use this parameter to run commands that take an extensive time to complete.
을 사용할 수 .cleanmgr /verylowdisk
모든 정리 단계를 자동화할 수 있습니다.
제가 찾은 유일한 해결책은 이렇게 레지스트리 값을 수동으로 설정하는 것입니다.
...
#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
...
저도 같은 문제에 부딪혔어요.가능한 방법을 조사해보니 다음과 같습니다. http://stealthpuppy.com/cleaning-up-and-reducing-the-size-of-your-master-image/
cmd를 통해 sageset 레지스트리 설정을 생성하는 방법을 보여줍니다.그런 다음 sagerun:# cmd를 사용할 수 있습니다.아직 스크립트를 통해 시도해 본 적은 없지만 작동하는 것을 확인했습니다.
RMM 툴(시스템에서 로컬로 스크립트를 실행)을 통해 Windows 10 및 11 테스트 VM에서 이 기능을 사용해 보았습니다.실행 정책이 바이패스(Bypass)로 설정된 두 세션 모두의 Administrative Powershell 세션에서 로컬로 PS1.(참고: RMM 도구는 스크립트를 SYSTEM으로 실행합니다. PS1을 사용하면 시스템의 로컬 관리자로 실행됩니다.)
내가 시도한 거의 모든 시스템에서 cleanmgr은 처음에 중단되고 완료되지 않습니다./sageset/sagerun 설정을 사용하거나 /very low disk를 사용하여 cleanmgr을 시도했습니다.보조 대기 명령을 사용했거나 사용하지 않고 사라졌습니다.제가 그걸 할 때는.PS1, Cleanmgr, -WindowStyle Hidden을 사용해도 팝업이 표시됩니다. 팝업은 어느 시점에서 사라지지만 스크립트는 그대로 유지되고 1시간 이상 앉아 있습니다(테스트 시스템에는 SSD가 있으므로 느리지 않음). 따라서 포기합니다.RMM 툴을 통해 작업을 수행할 때는 마찬가지로 매달립니다.PS1, 또는 가끔 "Object reference not set to object instance of object" 출력 또는 다른 오류가 나타납니다.일부 시스템에서는 스크립트를 종료하면 연속적인 시도로 실행됩니다.하지만 저는 그것이 지속적으로 진행되도록 할 수가 없습니다.너무 답답해요.
스크립트로 작성된 Remove-Item 명령어를 많이 사용하고 CLANEMGR을 건너뛸 지경에 이르렀습니다.EXE가 완전히 가능해요. 적어도 그것들은 효과가 있으니까요.그렇지 않으면 어디로 가야 할지 잘 모르겠습니다.
EDIT: 정답은 오직 -PassThru에서만 작동한다는 것입니다.그렇지 않으면 완전 토스업입니다.그래서 추가했습니다.그러나 스크립트의 다음 부분 전에 완료되지 않는 것이 걱정되어("잠깐"을 추가하면 문제가 다시 발생합니다), 정리 중에 사용 가능한 디스크 공간을 계산하기 전에 모든 시간을 주기 위해 "시작-슬립-초 300"을 추가했습니다.
이 스크립트는 레지스트리에서 모든 볼륨 캐시를 가져와 클리닝하고 CLANEMGR을 실행할 수 있게 합니다.모든 캐시에 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
CleanMgr.exe를 파워셸 스크립트에서 또는 자체적으로 실행하면 로컬 관리자 권한이 있는 계정으로 로컬에서 실행할 수 있습니다.그러나 원격 관리 도구나 원격 스크립팅 명령(Invoke-Command)을 통해 원격으로 실행해 보십시오. 실행되지 않습니다.원격 시스템에서 프로세스가 실행되는 것을 볼 수 있지만 아무것도 정리되지 않는 것 같고 프로세스가 끝나지 않습니다.만약 누군가가 클린mgr을 얻을 수 있다면 저는 관심이 있을 것입니다.사용자 상호 작용 없이 원격으로 실행할 수 있습니다.예: ConfigMgr 우클릭 도구, ConfigMgr App or PKG, Task Scheduler
저는 최근 Win11에서 모든 매개변수를 사용하여 몇 가지 테스트를 했습니다.매개 변수 '/sagerun:...'을(를) 추가할 때마다.' 프로세스는 더 이상 숨겨지지 않습니다.유일하게 작동하는 솔루션은 작업 스케줄러에서 매개 변수 '/autocleanstoragesense/dC:'와 같은 정확한 호출입니다.
sagerun-parameter를 추가하려면 다른 사용자 컨텍스트(여기서는 로컬 시스템)에서 프로세스를 시작해야 했습니다.
$reg = 'HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches'
$null = Get-ItemProperty -Path "$reg\*" -Name StateFlags0001 -ea 0 | Remove-ItemProperty -Name StateFlags0001 -ea 0
$null = New-ItemProperty -Path "$reg\Update Cleanup" -Name StateFlags0001 -Value 2 -PropertyType DWord
$null = New-ItemProperty -Path "$reg\Temporary Files" -Name StateFlags0001 -Value 2 -PropertyType DWord
$null = New-ItemProperty -Path "$reg\Previous Installations" -Name StateFlags0001 -Value 2 -PropertyType DWord
$null = New-ItemProperty -Path "$reg\Recycle Bin" -Name StateFlags0001 -Value 2 -PropertyType DWord
# start cleanup as local system (requires admin-rights):
$task = "Start Disk Cleanup"
$trigger = New-ScheduledTaskTrigger -Once -At (get-date)
$action = New-scheduledTaskAction -Execute "C:\Windows\System32\cleanmgr.exe" -Argument "/sagerun:1"
$settings = New-ScheduledTaskSettingsSet -ExecutionTimeLimit (New-TimeSpan -Minutes 20) -StartWhenAvailable -Hidden
$principal = New-ScheduledTaskPrincipal -UserId 'SYSTEM' -RunLevel Highest
$task1 = Register-ScheduledTask -trigger $trigger -Action $action -TaskName $task -Settings $settings -Principal $principal -TaskPath "CustomTasks" -Force 0 -ea 0
$result = Start-ScheduledTask -TaskName $task -TaskPath "CustomTasks"
$result = Unregister-ScheduledTask -TaskName $task -Confirm:0
# we can now remove the scheduled task folder (if empty):
$scheduler = New-Object -ComObject Schedule.Service
$scheduler.connect()
$rootDir = $scheduler.GetFolder('\')
try {$rootDir.DeleteFolder("CustomTasks", $null)} catch {}
Get-Process -Name cleanmgr,dismhost -ea 0 | Wait-Process
'done.'
언급URL : https://stackoverflow.com/questions/28852786/automate-process-of-disk-cleanup-cleanmgr-exe-without-user-intervention
'programing' 카테고리의 다른 글
간단한 Android Recycler보기 보기 (0) | 2023.09.08 |
---|---|
IE에서 배경 크기 작업을 하려면 어떻게 해야 합니까? (0) | 2023.09.08 |
Percona MySQL 마스터에서 MariaDB 슬레이브로 복제하는 것이 얼마나 안전합니까? (0) | 2023.09.08 |
Bootstrap4 dependency PopperJs가 Angular에서 오류를 발생시킵니다. (0) | 2023.09.08 |
MySQL은 그룹 다음에 null이 아닌 첫 번째 값을 가져옵니다. (0) | 2023.09.08 |