Program folder что это
ProgramData
ProgramData specifies the path to the program-data folder (normally C:\ProgramData). Unlike the Program Files folder, this folder can be used by applications to store data for standard users, because it does not require elevated permissions.
Warning  We don’t recommend using this setting, except perhaps in a test environment. The following are known issues:
Microsoft Store apps are not supported.
If you change the default location of the program-data folders to a volume other than the system volume, you cannot service your image. Any updates, fixes, or service packs may not be applied to the installation.
The path can be on a volume other than the system drive, as long as it meets the following requirements:
It must be on an NTFS volume.
It can’t point to a drive that has a different copy of Windows on it.
It can’t contain any serviceable components.
Values
Specifies the path to the program-data folder. Path_to_program_data_folder is a string with a maximum length of 259В characters.
This string type does not support empty elements. Do not create an empty value for this setting.
Valid Configuration Passes
Parent Hierarchy
Applies To
For a list of the Windows editions and architectures that this component supports, see Microsoft-Windows-Shell-Setup.
XML Example
The following XML example shows how to set the paths to folder locations.
How to clean up the Windows Program Files folder
Win32 programs have a lot of flexibility when it comes to the installation process. Programs may install in various directories, may write to the Registry, or run on system start without asking the user about it.
Most programs install in one of the «official» program folders. There is c:\Program Files\ for 64-bit applications, and c:\Program Files (x86)\ for 32-bit programs.
It often happens that the removal of programs leaves traces of the program on the system. It may be an empty start menu folder, values in the Registry, or files and folders on a connected hard drive.
Leftovers don’t cause functionality issues usually. There are exceptions to the rule, but the vast majority of leftovers have no impact on a system’s performance or stability.
They may cause other issues however like wasting disk space or making it more difficult to navigate the Start Menu or folders.
Cleaning up the Windows Program Files folder
You can use a program like the free Bulk Crap Uninstaller to clean up the program files folder. While you can do so manually as well, using Bulk Crap Uninstaller has the advantage that you can remove multiple orphan folders in one operation, and that you get a second opinion in the form of a confidence rating.
Tip: check out our review of Bulk Crap Uninstaller if you are new to the program. It highlights all important program features and helps you get acquainted with the application.
If you use custom install locations, do the following before you continue: select Tools > Settings > Folders, and add any custom installation folder to the listing. The program crawls any custom folder you add there for leftovers when you run the leftover removal tool.
Select Tools > Clean up «program files» folders to get started. The scan takes a couple of seconds to complete. Bulk Crap Uninstaller lists folders in the program files directories that it identified as an orphan.
The program lists the full folder path and a reputation rating for each item. The reputation algorithm uses positive and negative identifiers. A positive identifier is an empty program folder, for instance, a negative one if files are present.
Note: There is no backup or creation of a System Restore point prior to the removal. If you want to be on the save side, create a backup first before you proceed.
The author of the application suggests that you mark folders with very good or good reputation ratings only.
What you may want to do first is to verify the findings of the program. While you can mark any program for deletion that you identify as uninstalled already, it is likely that you cannot do that for all the orphan programs listed by Bulk Crap Uninstaller.
A double-click on an entry opens the program folder on the local system. You can right-click and select open from the context menu alternatively if you prefer it that way.
A click on the details entry of the context menu opens the list of positive and negative modifiers used by the confidence rating algorithm.
You can export the list of orphan program folders with a click on the export button, and change the default list of checked items as well. There is no option to uncheck all items to start with a clean slate, unfortunately.
The best way to go about it is to select only very good items and uncheck those manually afterward.
Select the program locations that you want to be removed from the system, and hit the delete selected button then to delete them.
Closing Words
The leftover removal scan of Bulk Crap Uninstaller takes care of orphan program folders that are not deleted properly during the removal of installed programs on Windows PCs. It is easy to use but could benefit from a couple of usability enhancements such as an option to uncheck all items, or an option to create a backup before running delete operations.
Now You: How do you handle orphan program files and folders?
About Martin Brinkmann
Related content
Network Protocol Analyzer Wireshark 3.6 released
Gog, Steam and Epic start Black Friday Game Sales: our top 3 picks
Winamp is set for a comeback, you can sign-up for the beta now
Barbados to Become the First Nation With a Virtual Embassy in the Metaverse
What are the top NFT coins? See our list here!
What is Big Time NFT game, and why is it so popular?
Comments
Now You: How do you handle orphan program files and folders?
You asked so I will reply… I stopped installing anything on Windows and I use it only for playing games and for Photoshop. I have installed only Steam and Photoshop on Windows. I dual boot to Antegros for every other task. Everything there installs and unistalls properly.
Here is what I do to minimize leftover fragments: 1) Almost never install any new programs ( I have run windows for over 15 years and pretty much seldom need anything new. I seldom install any program that automates what I can do manually.), 2) When I do uninstall something, I use Revo and its option to clean up leftovers after the software’s uninstall program has run, 3) Lastly, I search for the just uninstalled software with Everything and delete anything which is not in a temp folder (temp folders uninstall items after 30 days).
Maybe you could use this version of…. Revo Uninstaller Free 2.04 (from filehorse).
@exrelayman
Question: Why use Revo Uninstaller after you uninstall a program?
Am I missing something, because I only use Revo (the pro version) first and last?
I start with Revo. Seems like Revo allows the software’s uninstaller to function. I could be wrong in what I thought, but I do not use anything else besides Revo to uninstall except it seems there has been more than one occasion where Revo (and even Windows uninstaller) did not see something I wanted to uninstall. I can’t depend on my memory here, it has probably been more than a year since I uninstalled anything.
Yes, Revo starts the program’s own uninstaller first, then picks up from there.
The reason why you might need to uninstall with Revo already uninstalled programs is when you suspect (or know) that they have been badly uninstalled before. For instance, by running only the program’s embedded uninstaller, which often is not good enough.
But even Revo, or other third-party uninstallers, can miss things. There’s a margin of appreciation when using Revo. You can chose between three levels of cleaning. And even then, you’re offered the option to delete selectively individual folders and registry keys which are presented to you ; or to leave them alone. It’s not a black and white thing.
Also, some programs are particularly difficult to uninstall, and might create problems if they are not scrubbed properly. Antivirus comes to mind. That’s the reason several antivirus publishers offer their own specific power uninstaller you must download separately, if the embedded uninstaller does not manage to unroot the program.
From the screenshot provided, one of two things are possible: 1) The user installs/uninstalls a large number of programs and doesn’t use any type of uninstaller such as Geek or Revo or a program such as Advanced Uninstaller Pro that will record the installation of programs in order to completely uninstall a program later; 2) The user installs programs with unbelievably poor uninstallers that result in the numerous leftover files and, presumably, registry keys on the system.
The user may want to research other methods of “experimenting” with programs if he/she would like to avoid the need for programs such as BCU. Sandboxing would be one technique, but I think I would “play” with programs “just to see what they are like” on a virtual machine.
Personly I still use Revo.
Do you think that BulcCrapcleaner is a (slight or even significant) improvement over Revo?
Just tested BCU and got the following message :
No leftover were found. There still might be some residue left so you can run a temporary file cleaner like CCleaner 🙂
I don’t understand the need for a special uninstalling program regarding the program folders. Either your program is installed, or it has been uninstalled. If it’s not installed anymore and it still has remnants in one of the program folders, nuke them all through Windows Explorer.
What you need an uninstalling program for is the registry. There, the inbuilt uninstallers often don’t do their job properly. There might also be neglected folders outside the program folders. AppData and ProgramData are usually concerned, but some vicious programs also create folders in Documents, without necessary warning you.
Now the problem there is you might want on the contrary to keep the data even though you want the program uninstalled. It might be user data created by yourself (notes, documents…), or it might be large sets of settings you wish to keep in order to re-apply later. You might want to uninstall the program before installing a newer version, or you might want to do an uninstall / reinstall because you suspect something has gone wrong. In that case you would want the uninstall to be as clean and thorough as possible, except for user-created files and (possibly) settings.
Each time I can, I put user data and user settings in a specific folder tree which is completely different from the stardard Windows locations. So I’m sure everything I’ve put in there is deliberate and controlled by me. I have folders for Active Data (databases, online files which are not manually saved one by one, but are used by the program each time it’s launched), Backup Data (user settings), Logs, Software Installers (so I can reinstall if something goes wrong), Licence Numbers & Sales Receipts, and Documentation. Then each program gets its own subfolder in each of those folders as necessary.
I don’t clean the registry because I’m afraid it would grow too big or slow down the computer. I’m more afraid of conflicts. I remember one instance where superficial uninstall created problems with remnants in the registry. It was with Foxit Reader (and one or two other programs I don’t remember). For a very long time, they kept showing in my C-Cleaner list of applications to clean, although they had been uninstalled long ago. I had to search and kill remnants manually through Regedit before they stopped showing in C-Cleaner.
People keep telling you how obsolete registry keys won’t slow down your computer or (obviously) fill up your disk drive. But I’d love to have an expert opinion on possible conflicts arising from them. That’s the main reason why I deep-uninstall with Revo Uninstaller Pro.
That’s best way of dealing with software. I also prefer portable versions even when I never port them but install on hdd 😀 And when I reinstall windows software is untouched and ready. Portable soft FTW! 😉
I use uninstall tool. It also cleans left-overs & has an install feature that makes note off all file locations used when a new program is installed.
I clean also with Revo Pro and is it and complicated program that I’m uninstalling…than after Revo I search the registry with Regworkshop and clean all it find of that program.
I had found Revo Uninstaller to work quite well on windows 7 but this looks very promising.
Whilst trawling through my registry, which I do, from time to time, I often find junk that’s been left there and can it. Same with appdata and program data. I’ve found that BCR is just about the best of these programs that claim to get rid of everything. None of them do, though. Revo Pro is good, if you use it to install and trace, but I sometimes get some daft “Blah blah file can’t be found” message, when I try to do that.
Geek was good on an x86 rig, but not so good with an x64 one, even though the site claims it supports x64 natively. ZSoft’s uninstaller is the same, very cheap but not so good on x64 rigs. Nirsoft’s UninstallView is the same, too, even though I tried the x64 version, which was a shame, coz I quite expected that to find almost everything, but maybe I’m being unrealistic in my expectations…?
Thing is, WTF is it with Mickeysoft? It’s their operating system and their “features”, such as this, really are crap. I wonder why…? Not enough cash in it, I’d assume.
I totally disagree regarding that folders and files leftover cause to harm to Windows.
Just think that the registry records everything and so if there’re leftovers, they are recorded in the registry in the form of hundreds or thousands depending on what you do with the computer.
Even if you just change the location of a file or folder or delete it, the registry still has a key recorded which is checked by the OS and so it’ll slow down the system.
Same alarm is valid for all of these who claim that portable programs leave nothing behind, that is a bull because the program will create keys in the registry in order to function.
How do you handle orphan program files and folders?
I use Geek Uninstaller. If some orphans are left behind, I really don’t care. I run Glary Disk Cleaner and Glary Tracks Eraser every so often.
But I have this weird issue with a leftover listing from this portable software:
Years ago I was testing a portable version of MPC-BE that was in a folder on my desktop, and I made it the default media player in the Windows 10 settings, and it all worked great. So, some weeks later I deleted it, and then installed the full version of MPC-BE, and made that my default player, of which I still use with no issues.
But, whenever I right click a video file in Windows, and select open with>choose another app, the first option shown is for that portable version of MPC-BE (mpc-be.exe) that I had removed. It even shows the whole path of the folder that is no longer there.
Now, I very seldom use that right click option, so this is no big deal, but it’s weird that app is listed there still. I tried some obvious things to get rid of it, but no dice.
If I knew how to get rid of it I would. But no matter, as it’s a low priority annoyance, and the worst of my issues with Windows 10.
If anyone has any ideas, I’m game. And telling me to “use Linux” or “MPC-BE sucks” is not the type of help I’m looking for.
Настройки Windows 10: часть III, или куда приводят скрипты
Здравствуйте, товарищи! Прошло чуть больше полугода после выхода предыдущей статьи о Windows 10 Sophia Script — скрипте, который за прошедшие годы стал самым крупным (а их осталось всего два) опенсорс-проектом по персонализации и настройке Windows 10, а также автоматизации рутинных задач. В статье я расскажу, что изменилось с момента релиза версии, описываемой в статье от 29.09.2020, с какими трудностями мы столкнулись, и куда всё движется.
Как всё начиналось
Разработка наброска скрипта берёт своё начало в те далёкие времена, когда после года работы экономистом в отделе проектирования птицефабрики в одной организации я решил перейти в местный отдел IT.
Отдел IT
Так продолжалось, наверное, год, пока я не понял, что упёрся в тупик и надо менять язык: начал готовить «батник».
В первый день выхода Windows 10 я сразу же «пересел» на неё, поняв, что Windows 8.1 осталась для Microsoft в прошлом. Со временем же «батник» рос, «мужал», разрастался и в какой-то момент даже стал дёргать другой интерпретатор, powershell.exe. Скорость работы падала, и я понимал, что придётся учить PowerShell, так как batch уже не удовлетворяет моим маниакальным запросам автоматизировать всё при настройке ОС.
Как сейчас помню, в феврале 2017 года я сел читать первую статью по запросу «как внести данные в реестр с помощью PowerShell». Уже к лету 2017 года я значительно продвинулся в переписывании всех имеющих функций из «батника» в новый скрипт.
Помню, как первый раз почувствовал, что я делаю что-то полезное, когда некто создал issue с просьбой указывать, что я исправляю, когда перезаписываю файлы на GitHub. Пришлось вести журнал изменений.
В таком неспешном темпе разработка шла до августа 2019 года, когда я решил поделиться своими наработками здесь. Хотя я читаю Хабр с года эдак 2007-го, зарегистрировался лишь в 2016-м.
Немного облагородил код (ага, 10 раз), добавил описания на английском языке и накатал крохотную статью о своей pet-разработке. Удивительно, но статью пропустили, она попала в бездну, и я сел ждать.
Мой лик, когда ожидаю приглашения
Как сейчас помню: сижу на сеансе в кинотеатре, и приходит уведомление на почту о новом комментарии к моей статье. Так, стоп! Её одобрили?!
Я не успевал отвечать на комментарии! Это была какая-то эйфория. Какой там фильм?! — меня на Хабр пригласили прямым инвайтом! Фурор! Даже код не обо. ли (а там был кровавый мрак) и вообще любезно приняли.
Мой лик, когда получил приглашение
Самым неожиданным поворотом стало то, что через 5 дней после публикации мне написал некий Дмитрий (@oz-zo), прочитавший моё сетование на то, что у меня не хватает знаний, чтобы сделать графическую версию скрипта, даже хотя бы на Windows.Forms. Я был приятно удивлён, что есть ещё один старый безумец. Как выяснилось, старый, но не бесполезный!
Познакомившись, мы запланировали всё сделать примерно за 3 месяца на Windows.Forms, но наше приключение затянулось… больше чем на 1,5 года: лишь в этом месяце мы вышли на финишную прямую по созданию графической версии моего скрипта — SophiApp. Но это уже другая история, и, когда будет что показать, я обязательно расскажу, что мы пережили за время разработки, поделившись нашими инфернальными набросками и наработками.
С того времени как я познакомился с Дмитрием, разработка пошла быстрее: он внёс огромный вклад в создание новых функций, которых не было ни у кого: все графические функции с использованием WPF и логику к ним написал именно он; я лишь объяснил, как получать данные.
Иконка Sophia Script
Немаловажным событием стало также знакомство с Дэвидом из Канады, который решил сделать самостоятельно графическую надстройку для Sophia Script, Sophia Script Wrapper, для повышения удобства редактирования пресет-файла. В текущем варианте пользователь импортирует пресет-файл скрипта, и в программе расставляются радиокнопки в зависимости от закомментированных и раскомментированных функций. Дальше можно настроить под себя и запустить выполнение настроенного пресет-файла.
Хотя Дэвиду уже нормально так, программировать он сел лишь недавно, окончив курсы. Но его программа выполняет ту задачу, для которой её и написали. Одним словом, люди пользуются.
Sophia Script Wrapper
Что поменялось в скрипте
За время, прошедшее с момента выхода прошлой статьи в сентябре, много воды утекло. Скрипт уже и не узнать. Больше 12 000 строк кода… Самые интересные изыскания пришлись на удаление UWP-приложений и закрепление ярлыков на начальный экран.
Напомню, какие версии Windows 10 поддерживает скрипт на данный момент.
Версия
Маркетинговое название
Билд
Архитектура
Издания
October 2020 Update
LTSC Enterprise 2019
А теперь пройдёмся по всем доработанным и новым функциям.
Функции касающиеся манипуляций с UWP-приложениями
Наверное, вы уже заметили, что список стал локализованным. Также хочется добавить, что список генерируется динамически, загружая лишь установленные пакеты UWP-приложений в соответствии с текущей локализацией. Как это реализовано?
Свойство DisplayName, которое содержит локализованное имя пакета, находится лишь в одном классе (Get-AppxPackage вам никак тут не поможет, к сожалению):
На выходе вы получите что-то вроде этого (простыню кода прячу под спойлер)
Хоть на картинке и не видно, но кнопка «Для всех пользователей» была тоже полностью переписана. Раньше она совершенно неправильно работала. Сейчас же её логика приведена к должному функционалу. По умолчанию при загрузке формы отображается список приложений для текущего пользователя (все системные пакеты и Microsoft Store исключены из списка, так что удалить хоть что-то важное не получится никак, в отличие, кстати, от всех других скриптов в Интернете). При нажатии на кнопку «Для всех пользователей» происходит динамическая перегенерация списка с учётом установленных пакетов во всех учётных записях. То есть вы можете удалить все приложения для текущего пользователя, и форма отобразится пустой, но при запуске функции с ключом «-ForAllUsers» отобразится список пакетов для всех учётных записей.
Как-то меня попросили добавить поддержку PowerShell 7. И всё это было бы смешно, когда бы не было так грустно…
Во-первых, ни для кого не будет секретом, что, хотя в PowerShell 7 исправили очень много багов, в нынешнем виде очень далёк от финальной версии, ведь там до сих пор даже не работает командлет Get-ComputerRestorePoint из коробки. И (в качестве временного решения) Microsoft предложил загружать в сессию недостающие модули из папки PowerShell 5.1, используя аргумент -UseWindowsPowerShell.
Таким образом, мне приходится загружать модули Microsoft.PowerShell.Management, PackageManagement, Appx, чтобы воссоздать работоспособность скрипта на PowerShell 7:
Во-вторых, код для получения локализованных имен UWP-пакетов не работает в PowerShell 7 вообще, так как Microsoft решил не включать библиотеки WinRT в релизы PowerShell 7, но вынес разработку на отдельные ресурсы: WinRT и Windows.SDK. Это упомянул и Steven Lee в обсуждении на GitHub, а также уведомил, что команда PowerShell решила не включать в дальнейшем в релизы эти библиотеки. Поэтому, чтобы вызвать необходимые API, мне приходится хранить в папке две библиотеки по 26 МБ и 284 КБ. Тут остаётся лишь поставить мем с пингвином.
Код для получения локализованных имен UWP-пакетов на PowerShell 7 выглядит так:
На выходе будет что-то вроде:
Аналогичный подход используется для функции восстановления UWP-приложений. Чтобы восстановить пакет, как известно, необходимо вычленить путь до его манифеста.
Восстановление удаленных UWP-приложений для текущего пользователя
Код для получения общего списка всех манифестов выглядит так (можете даже выполнить, если, конечно, не удалили все UWP-приложения):
И вы увидите что-то вроде:
Но нам надо сопоставить имя пакета, его локализованное имя в системе и путь до манифеста. Искать будем среди пакетов, которые имеют статус «Staged», то есть готовы к восстановлению.
Ну, а дальше уже дело техники. Кстати, если вам надо восстановить все возможные пакеты без разбора, то в этом вам поможет.
Мы специально не хотели хардкодить список приложений как на удаление, так и на восстановление, так это слишком топорно. Одним словом, получить локализованные имена приложений реально. Дмитрий создал форму на WPF и накатал логику. Не знаю, почему, но мне с Дмитрием потребовалась, наверное, пара недель, учтя все возможные и невозможные условия использования, заставить всё работать как надо.
Точно таким же способом можно выводить список локализованных имён компонентов Windows и дополнительных компонентов.
Работает экстремально медленно, но спасает то, что у меня выводится лишь захардоженный список компонентов, которые можно безболезненно отключить (и включить опять, конечно).
Было
Стало
Наши лики, когда, наконец, всё заработало
Интернационализация скрипта
На необходимость этой фичи обратил внимание @FrankSinatra в комментариях. Интернационализация позволяет избавиться от страшной конструкции вида
Соответственно, чтобы это всё заработало, мы импортируем указанные локализационные файлы, сохраняя строки в переменную так, чтобы можно было вызывать их в скрипте:
И в зависимости от текущей локализации системы скрипт сам будет искать нужный файл. И код чище, и людя́м приятнее! Ну, а если необходимой локализации нет, то по умолчанию загружается английская.
На сегодня скрипт локализован на 8 языков: английский, китайский, немецкий, французский, итальянский, русский, украинский, турецкий, испанский и португальский. В будущем всё-таки планирую разместить языковые файлы на Crowdin, но немного душит жаба платить столько денег за некоммерческий продукт.
Закрепление ярлыков на начальном экране
Используется при этом чистый PowerShell. Изначально я использовал стороннюю программу syspin, но возникло желание всё-таки избавиться от неё. Как вы знаете, с выходом Windows 10 October 2018 Microsoft без шума закрыл доступ к API открепления (закрепления) ярлыков от начального экрана и панели задач: отныне это можно сделать лишь вручную.
Ниже приведён пример кода для закрепления (открепления) ярлыка на начальный экран, который когда-то работал. Как можете видеть, в коде используется метод получения локализованной строки, и для этого нам необходимо знать код строки, чтобы вызвать соответствующий пункт контекстного меню. В данном примере, чтобы закрепить ярлык командной строки, мы вызываем строку с кодом 51201, «Закрепить на начальном экране», из библиотеки %SystemRoot%\system32\shell32.dll.
Получить список всех локализованных строк удобнее всего через стороннюю утилиту ResourcesExtract.
Попытка закрепить ярлык командной строки устаревшим методом:
Сейчас консоль вываливается с ошибкой Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED).)
Хотя, как можно заметить, API, конечно, отдаёт глагол контекстного меню «Закрепить на начальном &экране», но не может его выполнить.
Идея заключается в том, чтобы использовать политику «Макет начального экрана» (Prevent users from customizing their Start Screen), отвечающую за подгрузку предзаготовленного макета в формате XML из определённого места. Таким образом, наш хак будет состоять из следующих пунктов:
Выгружаем текущий макет начального экрана.
Парсим XML, добавляя необходимые нам ярлыки (ссылки должны вести на реально существующие ярлыки), и сохраняем.
С помощью политики временно выключаем возможность редактировать макет начального экрана.
Перезапускаем меню «Пуск».
Программно открываем меню «Пуск», чтобы в реестре сохранился его макет.
Выключаем политику, чтобы можно было редактировать макет начального экрана.
И открываем меню «Пуск» опять.
Вуаля! В данном примере мы настроили начальный экран на лету, закрепив на него три ярлыка для текущего пользователя: панель управления, устройства и принтеры и PowerShell, причём без перезапуска или выхода из учётной записи.
Код целиком:
Создаваемые задания в планировщике заданий
Для начала разберём две задачи по автоматизации очистки папок %TEMP% и %SystemRoot%\SoftwareDistribution\Download. Эти папки полезно очищать по расписанию, чтобы они не разрастались. На текущий момент папка временных файлов самоочищается раз в 60 дней, а папка, куда скачиваются установочные файлы для обновлений, — раз в 90 дней.
По завершении задания были добавлены нативные всплывающие тосты, так сказать, из информационно-эстетических соображений.
Windows 10 позволяет генерировать такие тосты очень просто. Пример всплывающего тоста, как на картинке выше:
В вызове CreateToastNotifier можно указывать приложение, иконка которого будет отображаться в верхнем левом углу тоста и которое будет открываться при нажатии на тост. В данном случае я использовал windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel — «Настройки». Но вы вольны указать любые приложения. Узнать список всех установленных приложений и их AppID нам поможет команда Get-StartApps.
Напомню, что задача по очистке папки для временных файлов удаляет лишь файлы старше суток:
А задача по очистке папки %SystemRoot%\SoftwareDistribution\Download ждёт остановку службы wuauserv (Центр обновления Windows), чтобы в дальнейшем очистить папку
С заданием по запуску очистки диска и DISM с аргументами всё гораздо веселее. Изначально стояла задача просто запускать предзаготовленный пресет настроек для очистки диска и очистку ненужных обновлений, используя DISM: dism.exe /Online /English /Cleanup-Image /StartComponentCleanup /NoRestart.
Но пришлось решать, как заставить задание запускать очистку диска, сворачивать его окно, а потом также минимизировать окно консоли с запущенным DISM.
Сложность состоит в том, что при запуске очистки диска сначала открывается первое окошко со сканированием того, что можно очистить, потом оно закрывается, и только после этого открывается новое окошко (с новым MainWindowHandle) уже непосредственно с очисткой.
Если первое окошко достаточно легко свернуть:
То над тем, как свернуть второе, я поломал голову, конечно. После многих попыток хоть за что-то зацепиться, я понял, что:
только MainWindowHandle окна может помочь
Но на этом я не остановился. Понял, что, возможно, пользователю будет неудобно, что за него решают, когда запускается такая задача (которая иногда может потребовать достаточное количество времени). Поэтому пришла идея сделать интерактивный всплывающий тост!
Как видно на скриншоте, пользователю предоставляются на выбор 3 варианта развития событий: отложить вопрос на 1, 30 минут или 4 часа, полностью отклонить предложение (тогда задача запустится через 30 дней) или запустить.
Как устроено это окно. Это всё тот же тост, но, чтобы создать кнопку, запускающую что-либо, кроме открытия страницы в браузере, необходимо сначала зарегистрировать новый протокол. В примере ниже показывается, как я регистрирую протокол WindowsCleanup:
А потом привязываю его на кнопку запуска:
Всё вместе выглядит так:
Функция ассоциации файлов
Как известно, начиная с Windows 8 невозможно самостоятельно ассоциировать какое-либо расширение с программой, не вычислив правильный хэш. Как выяснилось, Microsoft проводит манипуляции с захардоженной строкой «User Choice set via Windows User Experience
Пользователь Danyfirex смог реализовать правильное вычисление хэш-суммы на чистом PowerShell, но, к сожалению, после проведённых тестов выяснилось, что сам PowerShell 5.1 считает его неправильно, поэтому я вынужден был использовать код другого разработчика с алгоритмом, реализованным на чистом C#. Крайне быстро! Функция огромная, поэтому просто оставлю просто ссылку на код.
Автоматизация установки бесплатного расширения для встроенного UWP-приложения Фотографии
Для скачивания установочного пакета на помощь приходит всеми известный сайт https://store.rg-adguard.net. Он позволяет, зная ID страницы, получать временные прямые ссылки на установочные пакеты. Значит, можно распарсить.
Дальше уже дело техники сохранить и установить скачанный пакет.
Автопродление имен функций по введённым буквам, содержащимся в названии функции или её аргумента
Это последняя значимая функция, добавленная в версию 5.10. Пользователи попросили добавить автопродление функций и их аргументов с помощью табуляции, вводя буквы, содержащиеся в названии функции или её аргументов.
То есть ни о каком автопродлении речи и не шло: пользователю приходилось или запоминать имя функции и её аргумент, или копировать вручную данную комбинацию из пресет-файла. То ли дело сейчас!
Чтобы заработала сия шайтан-машина, пришлось прибегнуть к Register-ArgumentCompleter.
Весь код сосредоточен в отдельном файле, и не получится его поместить в текущий пресет-файл: файл необходимо вызывать с использованием dot sourcing. Одним словом, пришлось в ScriptBlock для argumentcompleter перебирать все возможные варианты конструкций вида «функция-аргумент» и просто «функция», если у последней нет собственного аргумента.
Крайне жутко выглядит, но стало гораздо удобнее.
Ну, а закончу рассказ на том, что даже сборка прикрепляемых архивов на странице релизов стала осуществляться с помощью конфига Github Actions. Как можно заметить, для создания архива под версию для PowerShell 7 приходится выкачивать две библиотеки с ресурсов Microsoft, так как загрузить файлы больше 25 МБ в репозиторий невозможно. Автоматизируй автоматизацию!
Итоги
Это были крайне плодотворные полгода. У нас такое ощущение, что мы прошли PowerShell на уровне «Ultra Violence». Ну, а что дальше? Параллельно я прорабатываю вариант, как реализовать, используя текущий паттерн взаимодействия пользователя со скриптом, настройку офлайновых образов WIM. Но главный приоритет для нас сейчас, конечно, — разработка SophiApp.
Цель проекта — показать, как, по нашему мнению, должен выглядеть, чувствоваться и каким функционалом обладать так называемый твикер для Windows 10. Идей — просто огромное количество! Хотя у нас нет опыта в разработке и нас всего лишь двое, а весь код на SophiApp пишет в одиночку Дмитрий, возможно, летом уже появится первый рабочий билд. Но это уже совсем другая история.
Хочу выразить огромную благодарность также пользователям forum.ru-board westlife и iNNOKENTIY21: ребят, без вашей помощи и подсказок, всё было бы по-другому! А логотип нарисовала художница tea_head, за что ей тоже спасибо. Скрины, использованные в материале, взяты из мультфильма Коргот-варвар. Группа в Telegram. Любите Windows 10, настраивайте её с умом и до новых встреч!
А если хотите прокачать себя, например получить навыки пентестера и зарабатывать на уязвимостях, или подтянуть знания алгоритмов и структур данных — приходите учиться в SkillFactory, будет сложно, но интересно!
Узнайте, как прокачаться и в других специальностях или освоить их с нуля: