1 (изменено: Indomito, 2015-08-18 16:08:48)

Тема: AHK: Функция "Очистка Диска" в Win 7

Мне нужно автоматизировать очистку диска в Win 7.

Ранее я ей вообще не пользовался, но после выхода  KB2852386 это стало актуально.

8 октября 2013 Microsoft выпустило обновление для ОС Windows 7 под номером KB2852386, оно позволяет удалить (или сжать) старые версии обновлений, которые хранятся в системной папке WinSxS (c:\windows\winsxs). Это позволит освободить на диске пространство объемом в несколько гигабайт (при условии что автоматическое обновление у вас было включено).

Правда каждый раз входить и очищать, да ещё не забывать ставить галочки это немного проблематично.

Сам то я могу это сделать, но мне нужна программа, которая сама запустила очистку, предварительно проставив нужные галочки напротив пунктов не только у меня - приходится сначала побегать, а уж потом делать архивацию.
С сетью я разберусь, но вот скрипт не получается написать.

Используя Task Scheduler я написал.

::В командной строке, от имени администратора, выполните:
:: Настройка очистки папки WinSxS
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Update Cleanup" /v StateFlags0088 /t REG_DWORD /d 2 /f
:: Настройка очистки временных файлов  и папки Dism
REG ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VolumeCaches\Temporary Files" /v StateFlags0088 /t REG_DWORD /d 2 /f
:: Создаём задание "CleanupWinSxS" в Task Scheduler (1 раз в месяц)
schtasks /Create /TN CleanupWinSxS /RL Highest /SC monthly /TR "cleanmgr /sagerun:88"


Это раз в месяц, хотя можно и чаще, но мне нужно по сигналу - запуск exe/ lnk на exe, при определённых условиях.
Вот что у меня не получается. Это нужно особенно при/до BackUP системного диска, 3-12 Гб очищается, ну иногда меньше, для SSD это актуально.

Нужно.
1. Нужно запустить "Очистка Диска".
2. Поставить галочки на против нужных пунктов по моим условиям.
3. Выполнить очистку.

Если кто подобное делал или знает как - помогите, у меня это просто не получается.

UPD
Для NTFS-сжатия папки WinSxS надо установить права на группу Администраторы

:: Установка владельца папок и файлов в WinSxS  на Группу Администраторы
takeown /A /R /F C:\Windows\winsxs\*
:: Права полного доступа на  WinSxS
icacls C:\Windows\winsxs\* /T /grant Администраторы:(F)

После этого можно сжать папку WinSxS

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

2

Re: AHK: Функция "Очистка Диска" в Win 7

Check := "1|4|8"

SetTitleMatchMode 2
run %windir%\system32\cleanmgr.exe
WinWait Очистка диска  (C:) ahk_exe cleanmgr.exe
hwnd := WinExist("Очистка диска  (C:) ahk_exe cleanmgr.exe")
ControlGet hwndctrl, Hwnd , ,SysListView321, % "ahk_id " hwnd
ControlGet, LVItems, List, ,,ahk_id %hwndctrl%
ControlSend,, {Down}, ahk_id %hwndctrl%
Loop, parse,LVItems,`n
    {
    SendMessage, 0x102C, A_Index - 1, 0x2000,, ahk_id %hwndctrl% ; LVM_GETITEMSTATE
    if ErrorLevel
        ControlSend,, {Space}, ahk_id %hwndctrl%
    if (A_Index ~= "^" Check "$") or !Check
        ControlSend,, {Space}, ahk_id %hwndctrl%
    ControlSend,, {Down}, ahk_id %hwndctrl%
    }

ControlSend,, {Enter}, ahk_id %hwnd%
sleep 100
Send {Enter}

Я не знаю как программно в SysListView32 нажимать галочки, но я сделал что бы посылались клавиши.
В первой строчке номер галочки указывать через |. если список пуст то галочки все поставятся.

3 (изменено: Indomito, 2015-08-18 17:50:48)

Re: AHK: Функция "Очистка Диска" в Win 7

yalanne Как я понял строка кода.

Check := "1|4|8"

Это установить 1,4 и 8 галочку.

Верно?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

4

Re: AHK: Функция "Очистка Диска" в Win 7

Да, которых нет в списке отключаются.

5

Re: AHK: Функция "Очистка Диска" в Win 7

Спасибо, большего и не нужно.
Список статический, т.е. пункты не перемещаются, думаю это всё. Осталось протестировать.

Вопрос решён на 99%, 1% - это проверка.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

6

Re: AHK: Функция "Очистка Диска" в Win 7

yalanne Ты кое что упустил в скрипте.

/d буква_диска: – выбор диска для очистки. Обратите внимание, что параметр /d не используется со средством /sagerun:n.

Хотя можно запоминать его в /sagerun:n, но мне это не подходит немножко.

Вот начало кода.

Check := "1|4|8"

SetTitleMatchMode 2
run %windir%\system32\cleanmgr.exe /d C:
;А уж потом писать
WinWait Очистка диска  (C:) ahk_exe cleanmgr.exe
 

Без ключа выдаётся выпадающий список дисков.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

7 (изменено: Indomito, 2015-08-18 18:35:20)

Re: AHK: Функция "Очистка Диска" в Win 7

Так...

Написал.

Check := "1|4|5"

SetTitleMatchMode 2
run %windir%\system32\cleanmgr.exe /d C:
WinWait Очистка диска  (C:) ahk_exe cleanmgr.exe

Выбрались все пункты, что ты не учёл... пытаюсь разобраться.

И концовка не срабатывает, т.е. не нажатия на ОК.

ControlSend,, {Enter}, ahk_id %hwnd%
sleep 100
Send {Enter}
"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

8

Re: AHK: Функция "Очистка Диска" в Win 7

Check := "1|2"
Disc := "E"

SetTitleMatchMode 2
run %windir%\system32\cleanmgr.exe /d %Disc%:
WinWait % " (" Disc ":" ") ahk_exe cleanmgr.exe"
hwnd := WinExist(" (" Disc ":" ") ahk_exe cleanmgr.exe")
ControlGet hwndctrl, Hwnd , ,SysListView321, % "ahk_id " hwnd
ControlGet, LVItems, List, ,,ahk_id %hwndctrl%
ControlSend,, {Down}, ahk_id %hwndctrl%
Loop, parse,LVItems,`n
    {
    SendMessage, 0x102C, A_Index - 1, 0x2000,, ahk_id %hwndctrl% ; LVM_GETITEMSTATE
    if ErrorLevel
        ControlSend,, {Space}, ahk_id %hwndctrl%
    if (A_Index ~= "^" Check "$") or !Check
        ControlSend,, {Space}, ahk_id %hwndctrl%
    ControlSend,, {Down}, ahk_id %hwndctrl%
    }

ControlSend,, {Enter}, ahk_id %hwnd%
sleep 100
Send {Enter}

9 (изменено: Indomito, 2015-08-18 19:21:49)

Re: AHK: Функция "Очистка Диска" в Win 7

Так... нашёл ещё один прикол, но с чем он связан я не понял.

При обычной очистке - 12 пунктов.
При программной всего 5 пунктов.

Может нужен "Запуск от имени администратора"?

UPD

Перепробовал всё... не помогает.

Блин, забыл - Запуск из ком.процессора, это последнее что я не проверил.

Всё - не понимаю что не так, т.е. скрыты пункты которые можно очистить.

bat-файл выдаёт тоже самое, т.е. скрывает пункты, только запуск CMD.exe -> cleanmgr.exe /d c: показывает все пункты.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

10

Re: AHK: Функция "Очистка Диска" в Win 7

Check := "1|3"
Disc := "C"

ShellExecute := A_IsUnicode ? "shell32\ShellExecute":"shell32\ShellExecuteA"  
if not A_IsAdmin
{
      If A_IsCompiled
         DllCall(ShellExecute, uint, 0, str, "RunAs", str, A_ScriptFullPath, str, params , str, A_WorkingDir, int, 1)
      Else
         DllCall(ShellExecute, uint, 0, str, "RunAs", str, A_AhkPath, str, """" . A_ScriptFullPath . """" . A_Space . params, str, A_WorkingDir, int, 1)
      ExitApp
}

SetTitleMatchMode 2
run %windir%\system32\cleanmgr.exe /d %Disc%:
WinWait % " (" Disc ":" ") ahk_exe cleanmgr.exe"
hwnd := WinExist(" (" Disc ":" ") ahk_exe cleanmgr.exe")
ControlGet hwndctrl, Hwnd , ,SysListView321, % "ahk_id " hwnd
ControlGet, LVItems, List, ,,ahk_id %hwndctrl%
ControlSend,, {Down}, ahk_id %hwndctrl%
Loop, parse,LVItems,`n
    {
    SendMessage, 0x102C, A_Index - 1, 0x2000,, ahk_id %hwndctrl% ; LVM_GETITEMSTATE
    if ErrorLevel
        ControlSend,, {Space}, ahk_id %hwndctrl%
    if (A_Index ~= "^(" Check ")$") or !Check
        ControlSend,, {Space}, ahk_id %hwndctrl%
    ControlSend,, {Down}, ahk_id %hwndctrl%
    }
    
ControlSend,, {Enter}, ahk_id %hwnd%
sleep 100
Send {Enter}

Вот запуск с админкой + косяки с галочками исправил.

11 (изменено: Indomito, 2015-08-18 20:10:32)

Re: AHK: Функция "Очистка Диска" в Win 7

Не помогает, "-2" пункта по сравнению с консолью и самое главное не видит/не доходит до очистки обновлений.
Я и компилировал и так запускал, может нужно использовать другой bin в компиляции?
Например ANSI или по умолчанию?

Ёкарный-бабай!!!
У меня OS Windows 7 x64 - откомпилировал используя Unicode 64-bit.bin и всё заработало... да Windows это нечто. lol

P.S. Надо в скрипт вставить проверку OS на разрядность... вроде в AHK есть такая переменная + батник и два ЕХЕ-файла, т.е. не батник, а один стартовый, который запускает или x32 или x64 от типа разрядности OS.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

12

Re: AHK: Функция "Очистка Диска" в Win 7

Indomito пишет:

P.S. Надо в скрипт вставить проверку OS на разрядность...

Она есть в скрипте A_IsUnicode, но проверяло админку.

13 (изменено: Indomito, 2015-08-18 20:53:45)

Re: AHK: Функция "Очистка Диска" в Win 7

Ну да, вот проверка OS - может надо написать.

SetTitleMatchMode 2
run %windir%\system32\cleanmgr.exe /d %Disc%:

или

SetTitleMatchMode 2
run %windir%\SysWOW64\cleanmgr.exe /d %Disc%:

Но после компиляции поможет ли это - я не уверен, надо проверить.

P.S. Проверил - не помогает, запускает 32-х разрядную версию, если файл 32-x разрядный.
Ладно сделаем 3 файла, это не принципиально, а админка тут не причём, запускал с разных профилей... хотя боюсь что упустил, что на всех компах это профиль админский.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

14 (изменено: serzh82saratov, 2015-08-18 22:02:57)

Re: AHK: Функция "Очистка Диска" в Win 7

Есть ключи:

Syntax
     CLEANMGR option

Options
       /d driveletter: Select the drive that you want Disk Cleanup to clean.

       /sageset:n      Display the Disk Cleanup Settings dialog box and create
                       a registry key to store the settings you select.
                       The n value is stored in the registry and allows you to
                       specify different tasks for Disk Cleanup to run.
                       n can be any integer from 0 to 65535.
                       Specify the %systemroot% drive to see all the available options.

      /sagerun:n       Run task 'n'
                       All drives in the computer will be enumerated, and the
                       selected profile will be run against each drive.

    Only one of the 3 options above can be run at a time

      /TUNEUP:n        Run sageset + sagerun for the same n

      /LOWDISK         Run with the default settings.

      /VERYLOWDISK     Run with the default settings, no user prompts.

      /SETUP           Undocumented
      /Help            Undocumented
      /Usage           Undocumented
      /?               Display help

Если один раз запустить:

run cleanmgr.exe /sageset: 1

Поставить нужные отметки, нажать ок для сохранения настроек в реестр под номером 1.

И далее просто запускать с сохранёнными настройками:

run cleanmgr.exe /d C: /sagerun: 1
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

15 (изменено: Indomito, 2015-08-18 23:08:27)

Re: AHK: Функция "Очистка Диска" в Win 7

serzh82saratov Одно уточнение. Ключ /d не совместим с ключом /sagerun:.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

16

Re: AHK: Функция "Очистка Диска" в Win 7

Пробовал на системном диске, не заметил, тогда не вариант.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17 (изменено: Indomito, 2015-08-19 00:07:48)

Re: AHK: Функция "Очистка Диска" в Win 7

serzh82saratov пишет:

Пробовал на системном диске, не заметил, тогда не вариант.

Да можно написать, но придётся создавать много профилей для ключа /sagerun, а для одного компа достаточно использовать этот ключ.

Служба поддержки Майкрософт (cleanmgr.exe)

Средство очистки диска поддерживает следующие параметры командной строки.

    /d driveletter. Выбор диска для очистки.

    Примечание. Параметр /d игнорируется, если задан параметр /sagerun: n.

Вот, по сути из за чего возникла необходимость написания скрипта.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

18

Re: AHK: Функция "Очистка Диска" в Win 7

Так а в чем проблема?
Зеаносишь в реестр:

run cleanmgr.exe /d X: /sageset:n

И он сохраняет настройки для нужного тебе диска (в sagerun диск указывать не надо поэтому и пишут, что Ключ /d не совместим с ключом /sagerun:./d ).

19

Re: AHK: Функция "Очистка Диска" в Win 7

Можно и так, что будет эквивалентно скрипту, только куда заносить, что бы он срабатывал по внешнему сигналу, а не по расписанию, а?
Просто я не знаю.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro

20

Re: AHK: Функция "Очистка Диска" в Win 7

Так serzh82saratov написал в 14 посту:

И далее просто запускать с сохранёнными настройками

21

Re: AHK: Функция "Очистка Диска" в Win 7

А ты про это... но когда парк более 20 компов + разные ОС + миграция... просто я уже много раз прокалывался, т.к. на сервере стартует BackUp, даёт сигнал по всем компам, ждёт, делает резервное копирование, а потом выясняется, что где то не та ОС и не так сработала очистка.

Если дома, то можно через /sageset:n и /sagerun:n, а вот на работе косяки получаются - постоянно приходится проверять, что у кого поменялось.

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
Для NotePad++(подсветка синтаксиса, автозавершение и плагины(AutoSave и RunMe).
OS Windows 10 x64 Pro