powershell 自动执行磁盘清理cleanmgr.exe,无需用户干预

gojuced7  于 2023-03-30  发布在  Shell
关注(0)|答案(8)|浏览(225)

我正在开发一个powershell脚本文件,它将在没有用户干预的情况下执行一些磁盘清理。用户将无法配置任何东西。
当我运行cleanmgr.exe /d c: sageset:1时,会出现一个弹出窗口,选择要清理的文件/文件夹(清理选项)。
这将创建一个注册表项,其中包含带有清理选项的设置,之后,您可以运行cleanmgr.exe /sagerun:1,它将实际执行清理。
有没有一种方法可以直接用powerhell/命令行指定清理选项(而不需要手动选择要删除的东西)?

ibrsph3r

ibrsph3r1#

以下Powershell脚本自动执行CleanMgr.exe。在这种情况下,它将删除临时文件并运行更新清理扩展插件以清除被取代的Service Pack备份文件(Windows 10现在通过计划任务自动执行此操作)。要自动执行其他扩展,请在相应的注册表项中创建“StateFlags 0001”属性,如在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....'
}
jpfvwuh4

jpfvwuh42#

下面提供的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.
63lcw9qa

63lcw9qa3#

您可以使用cleanmgr /verylowdisk静默地自动执行所有清理步骤。

ki0zmccv

ki0zmccv4#

我找到的唯一解决方案是手动设置注册表值,如下所示:
...

#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

...
see full example

aoyhnmkz

aoyhnmkz5#

我遇到了同样的问题。研究可能的方法,我发现了以下几点:http://stealthpuppy.com/cleaning-up-and-reducing-the-size-of-your-master-image/
它展示了如何通过cmd创建sageset注册表设置。然后您可以使用sagerun:# cmd。我还没有通过脚本尝试过,但已经验证了它的工作原理...

t8e9dugd

t8e9dugd6#

我已经尝试在Windows 10和11测试虚拟机上使用此功能,无论是从我的RMM工具(在系统上本地运行脚本),还是在ExecutionPolicy设置为Bypass的情况下,从管理Powershell会话中本地运行.PS1。(注意:我的RMM工具作为SYSTEM运行脚本;当我使用PS1时,我以系统的本地管理员身份运行)。
在我试过的几乎所有系统上,cleanmgr第一次都挂起,永远不会完成。我用/sageset /sagerun设置或只使用/verylowdisk尝试cleanmgr。我使用了第二个wait命令,或者没有使用它。当我用.PS1执行时,Cleanmgr,即使使用-WindowStyle Hidden仍然显示弹出窗口,在某个时候它会消失,但脚本仍然卡住。坐在那里一个小时或更长时间(测试系统有SSD,所以不慢),于是我给予了。当我通过RMM工具做的时候,它要么就像.PS1一样挂起,要么偶尔我得到一个输出“对象引用没有设置为对象的示例”,或者另一个错误。在一些系统上,如果我结束脚本,然后它会连续运行。但是我不能让它一直运行。太令人沮丧了。
我几乎到了只使用一堆脚本化的Remove-Item命令并完全跳过CLEANMGR.EXE的地步,因为至少这些命令可以工作。
编辑:答案是它只适用于-PassThru。否则,它完全是一个tossup。所以我添加了它。我担心它不会在我的脚本的下一部分之前完成(添加“-Wait”会带来问题),所以我添加了“Start-Sleep -Seconds 300”以确保我在继续计算清理过程中释放了多少磁盘空间之前给予所有时间。

yyhrrdl8

yyhrrdl87#

此脚本将从注册表中获取所有卷缓存,使它们能够被清理,并为所有缓存运行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
0mkxixxg

0mkxixxg8#

只要您使用具有本地管理员权限的帐户在本地运行CleanMgr.exe,在powershell脚本中运行或单独运行CleanMgr.exe似乎都可以正常工作。但请尝试通过任何远程管理工具或远程脚本命令远程运行它(Invoke-Command)并且它不运行。您可能会看到该进程在远程系统上运行,但它似乎没有清理任何内容,并且该进程永远不会结束。我会很感兴趣,如果有人已经能够得到cleanmgr.exe远程运行,没有任何用户交互。E.G. ConfigMgr右键单击工具,ConfigMgr应用程序或PKG,任务计划程序。

相关问题