自动执行磁盘清理 cleanmgr.exe,无需用户干预
Automate process of Disk Cleanup cleanmgr.exe without user intervention
我正在开发一个 powershell 脚本文件,它将在没有用户干预的情况下执行一些磁盘清理。用户不能配置任何东西。
当我 运行 cleanmgr.exe /d c: sageset:1
一个弹出窗口 window 出现在 select files/folders 被清理(清理选项)。
这将创建一个注册表项,其中包含带有清理选项的设置,在此之后,您可以 运行 cleanmgr.exe /sagerun:1
这将实际执行清理。
有没有办法直接用 powerhell/command 行指定清理选项(而不需要手动 select 要删除的东西)?
我运行遇到了同样的问题。研究可能的方法,我发现了以下内容:
http://stealthpuppy.com/cleaning-up-and-reducing-the-size-of-your-master-image/
它展示了如何通过 cmd 创建 sageset 注册表设置。然后您可以使用 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
...
以下 Powershell 脚本会自动执行 CleanMgr.exe。在这种情况下,它会删除临时文件并运行更新清理扩展以清除被取代的 Service Pack 备份文件(Windows 10 现在通过计划任务自动执行此操作)。要自动化其他扩展,请在相应的注册表项中创建 "StateFlags0001" 属性,就像在 New-ItemProperty 行中所做的那样。您将在 "VolumeCaches" 分支中找到注册表项名称。
就静默而言,此脚本试图在隐藏的 window 中启动 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
自动执行所有清理步骤。
此脚本将从注册表中获取所有卷缓存,使它们能够被清理,并且 运行 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
下面提供的 PowerShell 逻辑是动态的,可以随时使用或自动化,所有 sageset
选项都被选中并且不需要用户交互。这是受到来自 post.
的多个答案和评论的启发
注意: 我已经根据自己的需要进行了调整,并且在多个远程和本地 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.exe 在 powershell 脚本中或本身似乎工作正常,只要您 运行 在本地使用具有本地管理员权限的帐户。但是尝试 运行 通过任何远程管理工具或远程脚本命令 (Invoke-Command) 远程连接它,但它不会 运行。您可能会在远程系统上看到 运行ning 进程,但它似乎没有清理任何东西,而且该进程永远不会结束。如果有人能够在没有任何用户交互的情况下远程获取 cleanmgr.exe 到 运行,我会很感兴趣。例如。 ConfigMgr 右键单击工具、ConfigMgr 应用程序或 PKG、任务计划程序。
我正在开发一个 powershell 脚本文件,它将在没有用户干预的情况下执行一些磁盘清理。用户不能配置任何东西。
当我 运行 cleanmgr.exe /d c: sageset:1
一个弹出窗口 window 出现在 select files/folders 被清理(清理选项)。
这将创建一个注册表项,其中包含带有清理选项的设置,在此之后,您可以 运行 cleanmgr.exe /sagerun:1
这将实际执行清理。
有没有办法直接用 powerhell/command 行指定清理选项(而不需要手动 select 要删除的东西)?
我运行遇到了同样的问题。研究可能的方法,我发现了以下内容: http://stealthpuppy.com/cleaning-up-and-reducing-the-size-of-your-master-image/
它展示了如何通过 cmd 创建 sageset 注册表设置。然后您可以使用 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
...
以下 Powershell 脚本会自动执行 CleanMgr.exe。在这种情况下,它会删除临时文件并运行更新清理扩展以清除被取代的 Service Pack 备份文件(Windows 10 现在通过计划任务自动执行此操作)。要自动化其他扩展,请在相应的注册表项中创建 "StateFlags0001" 属性,就像在 New-ItemProperty 行中所做的那样。您将在 "VolumeCaches" 分支中找到注册表项名称。
就静默而言,此脚本试图在隐藏的 window 中启动 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
自动执行所有清理步骤。
此脚本将从注册表中获取所有卷缓存,使它们能够被清理,并且 运行 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
下面提供的 PowerShell 逻辑是动态的,可以随时使用或自动化,所有 sageset
选项都被选中并且不需要用户交互。这是受到来自 post.
注意: 我已经根据自己的需要进行了调整,并且在多个远程和本地 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.exe 在 powershell 脚本中或本身似乎工作正常,只要您 运行 在本地使用具有本地管理员权限的帐户。但是尝试 运行 通过任何远程管理工具或远程脚本命令 (Invoke-Command) 远程连接它,但它不会 运行。您可能会在远程系统上看到 运行ning 进程,但它似乎没有清理任何东西,而且该进程永远不会结束。如果有人能够在没有任何用户交互的情况下远程获取 cleanmgr.exe 到 运行,我会很感兴趣。例如。 ConfigMgr 右键单击工具、ConfigMgr 应用程序或 PKG、任务计划程序。