Sophie script windows 11 как запустить

:zap: The most powerful PowerShell module on GitHub for fine-tuning Windows 10 & Windows 11 - Sophia-Script-for-Windows/README.md at master · farag2/Sophia-Script-for-Windows

This page also in:

Sophia Script for Windows

Sophia Script





Telegram
Telegram

Discord


 

 

 

 

 

 

 

 

 

 

 




Donations

System Requirements

Screenshots

Videos

Key features

How to use

How to translate

SophiApp

Changelog

About Sophia Script

Typing SVG

Note: Sophia Script for Windows is the largest PowerShell module on GitHub for Windows 10 & Windows 11 fine-tuning and automating the routine tasks. It offers more than 150 unique tweaks, and shows how Windows can be configured without making any harm to it.

Before running

Note: Due to the fact that the script includes more than 150 functions with different arguments, you must read the entire Sophia.ps1 carefully and comment out/uncomment those functions that you do/do not want to be executed (without need to edit the code), or use Wrapper. Every tweak in the preset file has its’ corresponding function to restore the default settings. Running the script is best done on a fresh install because running it on wrong tweaked system may result in errors occurring.

Donations


ko-fi
USDT (TRC20)
TQtMjdocUWbKAeg1kLtB4ApjAVHt1v8Rtf

System Requirements

Version Marketing name Build Arch Editions
Windows 11 Insider Preview 23H2 2023 Update 22509+ Home/Pro/Enterprise
Windows 11 22H2 2022 Update 22621.963+ Home/Pro/Enterprise
Windows 11 21H2 22000.1335+ Home/Pro/Enterprise
Windows 10 22H2 2022 Update 19045.2364+ x64 Home/Pro/Enterprise
Windows 10 21H2 October 2021 Update 19044.2364+ x64 Home/Pro/Enterprise
Windows 10 21H2 Enterprise LTSC 2021 October 2021 Update 19044.2364+ x64 Enterprise
Windows 10 1809 Enterprise LTSC 2019 October 2018 Update 17763.3770+ x64 Enterprise

Warning

  • It’s allowed to be logged in as one admin user only during application startup.
  • 🔥🔥🔥Sophia Script for Windows may not work on a homebrew Windows. Especially, if the homebrew image was created by OS makers being all thumbs who break Microsoft Defender and disable OS telemetry by purposely uprooting system components

Key features

  • Set up Privacy & Telemetry;
  • Enable DNS-over-HTTPS for IPv4;
  • Turn off diagnostics tracking scheduled tasks with pop-up form written in WPF;
  • Set up UI & Personalization;
  • Uninstall OneDrive «correctly»;
  • Interactive prompts;
  • The TAB completion for functions and their arguments (if using the Functions.ps1 file);
  • Change %TEMP% environment variable path to %SystemDrive%Temp;
  • Change location of the user folders programmatically (without moving user files) within interactive menu using arrows to select a drive
    • «Desktop»
    • «Documents»
    • «Downloads»
    • «Music»
    • «Pictures»
    • «Videos»
  • Install free (light and dark) «Windows 11 Cursors Concept v2» cursors from Jepri Creations on-the-fly;
  • Uninstall UWP apps displaying packages names;
    • Generate installed UWP apps list dynamically
  • Restore the default uninstalled UWP apps for current user displaying localized packages names;
  • The TAB autocompletion for function and its’ arguments by typing first letters;
  • Disable Windows features displaying friendly packages names with pop-up form written in WPF;
  • Uninstall Windows capabilities displaying friendly packages names with pop-up form written in WPF;
  • Download and install the HEVC Video Extensions from Device Manufacturer to be able to open .heic and .heif formats;
  • Register app, calculate hash, and set as default for specific extension without the «How do you want to open this» pop-up using special function;
  • Install any supported Linux distrobution for WSL displaying friendly distro names with pop-up form written in WPF;
  • Create a Windows Cleanup and Windows Cleanup Notification scheduled tasks for Windows cleaning up unused files and updates;
    • A native toast notification will be displayed where you can choose to snooze, run the cleanup task or dismiss
  • Create tasks in the Task Scheduler to clear
    • %SystemRoot%SoftwareDistributionDownload
    • %TEMP%
  • Pin shortcuts to Start via pure PowerShell
    • Three shortcuts are pre-configured to be pinned: Control Panel, «old style» Devices and Printers, and Windows PowerShell
  • Unpin all Start menu tiles;
  • Turn on Controlled folder access and add protected folders using dialog menu;
  • Add exclusion folder from Microsoft Defender Antivirus scanning using dialog menu;
  • Add exclusion file from Microsoft Defender Antivirus scanning using dialog menu;
  • Refresh desktop icons, environment variables and taskbar without restarting File Explorer;
  • Configure the Windows security;
  • Many more File Explorer and context menu «deep» tweaks.

Screenshots

The TAB autocomplete. Read more here

Image

Change user folders location programmatically using the interactive menu

Image

Localized UWP packages names

Image Image

Localized Windows features names

Image Image

Download and install any supported Linux distribution in automatic mode

Image

Native interactive toasts for the scheduled tasks

Image

@BenchTweakGaming Sophia Script Wrapper

Wrapper

Videos

YT

YT YT

How to use

  • Choose the right script version for your Windows;

  • Download up-to-date version;

  • Expand the archive;

  • Open folder with the expanded archive;

  • Look through the Sophia.ps1 file to configure functions that you want to be run;

    • Place the «#» char before function if you don’t want it to be run.
    • Remove the «#» char before function if you want it to be run.
  • On Windows 10 click File in File Explorer, hover over Open Windows PowerShell, and select Open Windows PowerShell as Administrator (how-to with screenshots)

  • On Windows 11 right-click on the Windows icon and select Windows Terminal (Admin). Then change the current location

    Set-Location -Path "PathToSophiaFolder"
  • Set execution policy to be able to run scripts only in the current PowerShell session

    Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
  • Type .Sophia.ps1 Enter to run the whole preset file.

How to use Wrapper

  • Download and expand the archive;
  • Run SophiaScriptWrapper.exe and import Sophia.ps1;
    • The Wrapper has a real time UI rendering;
  • Configure every function;
  • Open the Console Output tab and press Run PowerShell.

How to run the specific function(s)

To run the specific function(s) dot source the Functions.ps1 file first:

# With a dot at the beginning
. .Functions.ps1
  • Now you can do like this (the quotation marks required)
Sophia -Functions<kbd>TAB</kbd>
Sophia -Functions temp<kbd>TAB</kbd>
Sophia -Functions unin<kbd>TAB</kbd>
Sophia -Functions uwp<kbd>TAB</kbd>
Sophia -Functions "DiagTrackService -Disable", "DiagnosticDataLevel -Minimal", UninstallUWPApps

UninstallUWPApps, "PinToStart -UnpinAll"

Or use an old-style format without the TAB functions autocomplete (the quotation marks required)

.Sophia.ps1 -Functions CreateRestorePoint, "ScheduledTasks -Disable", "WindowsCapabilities -Uninstall"

How to download Sophia Script via PowerShell

  • Download the always latest Sophia Script archive by invoking (not as administrator too) in PowerShell
irm script.sophi.app -useb | iex
  • The command will download and expand the latest Sophia Script archive (without running) according which Windows and PowerShell versions it is run on. If you run it on, e.g., Windows 11 via PowerShell 5.1, it will download Sophia Script for Windows 11 PowerShell 5.1.

How to translate

  • Get your OS UI culture by invoking $PSUICulture in PowerShell;
  • Create a folder with the UI culture name;
  • Place your localized Sophia.psd1 file into this folder.

Media

  • Discord
  • Telegram discussion group
  • Telegram channel
  • Ru-Board
  • rutracker
  • My Digital Life
  • 4sysops
  • gHacks Technology News
  • Neowin: Tech News, Reviews & Betas
  • Comss.ru
  • Habr
  • Deskmodder.d
  • PCsoleil Informatique
  • Reddit (archived)
    • PM me

SophiApp Community Edition (C# + WPF)

SophiApp is in active development 🚀

Image
Image

This page also in:

Sophia Script for Windows

Sophia Script





Telegram
Telegram

Discord


 

 

 

 

 

 

 

 

 

 

 




Donations

System Requirements

Screenshots

Videos

Key features

How to use

How to translate

SophiApp

Changelog

About Sophia Script

Typing SVG

Note: Sophia Script for Windows is the largest PowerShell module on GitHub for Windows 10 & Windows 11 fine-tuning and automating the routine tasks. It offers more than 150 unique tweaks, and shows how Windows can be configured without making any harm to it.

Before running

Note: Due to the fact that the script includes more than 150 functions with different arguments, you must read the entire Sophia.ps1 carefully and comment out/uncomment those functions that you do/do not want to be executed (without need to edit the code), or use Wrapper. Every tweak in the preset file has its’ corresponding function to restore the default settings. Running the script is best done on a fresh install because running it on wrong tweaked system may result in errors occurring.

Donations


ko-fi
USDT (TRC20)
TQtMjdocUWbKAeg1kLtB4ApjAVHt1v8Rtf

System Requirements

Version Marketing name Build Arch Editions
Windows 11 Insider Preview 23H2 2023 Update 22509+ Home/Pro/Enterprise
Windows 11 22H2 2022 Update 22621.963+ Home/Pro/Enterprise
Windows 11 21H2 22000.1335+ Home/Pro/Enterprise
Windows 10 22H2 2022 Update 19045.2364+ x64 Home/Pro/Enterprise
Windows 10 21H2 October 2021 Update 19044.2364+ x64 Home/Pro/Enterprise
Windows 10 21H2 Enterprise LTSC 2021 October 2021 Update 19044.2364+ x64 Enterprise
Windows 10 1809 Enterprise LTSC 2019 October 2018 Update 17763.3770+ x64 Enterprise

Warning

  • It’s allowed to be logged in as one admin user only during application startup.
  • 🔥🔥🔥Sophia Script for Windows may not work on a homebrew Windows. Especially, if the homebrew image was created by OS makers being all thumbs who break Microsoft Defender and disable OS telemetry by purposely uprooting system components

Key features

  • Set up Privacy & Telemetry;
  • Enable DNS-over-HTTPS for IPv4;
  • Turn off diagnostics tracking scheduled tasks with pop-up form written in WPF;
  • Set up UI & Personalization;
  • Uninstall OneDrive «correctly»;
  • Interactive prompts;
  • The TAB completion for functions and their arguments (if using the Functions.ps1 file);
  • Change %TEMP% environment variable path to %SystemDrive%Temp;
  • Change location of the user folders programmatically (without moving user files) within interactive menu using arrows to select a drive
    • «Desktop»
    • «Documents»
    • «Downloads»
    • «Music»
    • «Pictures»
    • «Videos»
  • Install free (light and dark) «Windows 11 Cursors Concept v2» cursors from Jepri Creations on-the-fly;
  • Uninstall UWP apps displaying packages names;
    • Generate installed UWP apps list dynamically
  • Restore the default uninstalled UWP apps for current user displaying localized packages names;
  • The TAB autocompletion for function and its’ arguments by typing first letters;
  • Disable Windows features displaying friendly packages names with pop-up form written in WPF;
  • Uninstall Windows capabilities displaying friendly packages names with pop-up form written in WPF;
  • Download and install the HEVC Video Extensions from Device Manufacturer to be able to open .heic and .heif formats;
  • Register app, calculate hash, and set as default for specific extension without the «How do you want to open this» pop-up using special function;
  • Install any supported Linux distrobution for WSL displaying friendly distro names with pop-up form written in WPF;
  • Create a Windows Cleanup and Windows Cleanup Notification scheduled tasks for Windows cleaning up unused files and updates;
    • A native toast notification will be displayed where you can choose to snooze, run the cleanup task or dismiss
  • Create tasks in the Task Scheduler to clear
    • %SystemRoot%SoftwareDistributionDownload
    • %TEMP%
  • Pin shortcuts to Start via pure PowerShell
    • Three shortcuts are pre-configured to be pinned: Control Panel, «old style» Devices and Printers, and Windows PowerShell
  • Unpin all Start menu tiles;
  • Turn on Controlled folder access and add protected folders using dialog menu;
  • Add exclusion folder from Microsoft Defender Antivirus scanning using dialog menu;
  • Add exclusion file from Microsoft Defender Antivirus scanning using dialog menu;
  • Refresh desktop icons, environment variables and taskbar without restarting File Explorer;
  • Configure the Windows security;
  • Many more File Explorer and context menu «deep» tweaks.

Screenshots

The TAB autocomplete. Read more here

Image

Change user folders location programmatically using the interactive menu

Image

Localized UWP packages names

Image Image

Localized Windows features names

Image Image

Download and install any supported Linux distribution in automatic mode

Image

Native interactive toasts for the scheduled tasks

Image

@BenchTweakGaming Sophia Script Wrapper

Wrapper

Videos

YT

YT YT

How to use

  • Choose the right script version for your Windows;

  • Download up-to-date version;

  • Expand the archive;

  • Open folder with the expanded archive;

  • Look through the Sophia.ps1 file to configure functions that you want to be run;

    • Place the «#» char before function if you don’t want it to be run.
    • Remove the «#» char before function if you want it to be run.
  • On Windows 10 click File in File Explorer, hover over Open Windows PowerShell, and select Open Windows PowerShell as Administrator (how-to with screenshots)

  • On Windows 11 right-click on the Windows icon and select Windows Terminal (Admin). Then change the current location

    Set-Location -Path "PathToSophiaFolder"
  • Set execution policy to be able to run scripts only in the current PowerShell session

    Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
  • Type .Sophia.ps1 Enter to run the whole preset file.

How to use Wrapper

  • Download and expand the archive;
  • Run SophiaScriptWrapper.exe and import Sophia.ps1;
    • The Wrapper has a real time UI rendering;
  • Configure every function;
  • Open the Console Output tab and press Run PowerShell.

How to run the specific function(s)

To run the specific function(s) dot source the Functions.ps1 file first:

# With a dot at the beginning
. .Functions.ps1
  • Now you can do like this (the quotation marks required)
Sophia -Functions<kbd>TAB</kbd>
Sophia -Functions temp<kbd>TAB</kbd>
Sophia -Functions unin<kbd>TAB</kbd>
Sophia -Functions uwp<kbd>TAB</kbd>
Sophia -Functions "DiagTrackService -Disable", "DiagnosticDataLevel -Minimal", UninstallUWPApps

UninstallUWPApps, "PinToStart -UnpinAll"

Or use an old-style format without the TAB functions autocomplete (the quotation marks required)

.Sophia.ps1 -Functions CreateRestorePoint, "ScheduledTasks -Disable", "WindowsCapabilities -Uninstall"

How to download Sophia Script via PowerShell

  • Download the always latest Sophia Script archive by invoking (not as administrator too) in PowerShell
irm script.sophi.app -useb | iex
  • The command will download and expand the latest Sophia Script archive (without running) according which Windows and PowerShell versions it is run on. If you run it on, e.g., Windows 11 via PowerShell 5.1, it will download Sophia Script for Windows 11 PowerShell 5.1.

How to translate

  • Get your OS UI culture by invoking $PSUICulture in PowerShell;
  • Create a folder with the UI culture name;
  • Place your localized Sophia.psd1 file into this folder.

Media

  • Discord
  • Telegram discussion group
  • Telegram channel
  • Ru-Board
  • rutracker
  • My Digital Life
  • 4sysops
  • gHacks Technology News
  • Neowin: Tech News, Reviews & Betas
  • Comss.ru
  • Habr
  • Deskmodder.d
  • PCsoleil Informatique
  • Reddit (archived)
    • PM me

SophiApp Community Edition (C# + WPF)

SophiApp is in active development 🚀

Image
Image

Вот уже много лет я поддерживаю Sophia Script for Windows, крупнейшего PowerShell-модуля на GitHub для тонкой настройки Windows 10 и Windows 11.

После бесконечных правок мы хотим показать вам SophiApp — графический наследних Sophia Script for Windows: бесплатная и полностью опенсорная программа для тонкой настройки Windows 10 и Windows 11.

И все эти время у меня была идея сделать ее графическую версию, чтобы показать пользователям, каким должен быть современный твикер для Windows, какие функции может в себе нести, а главное — посыл программы: настроить (а не оптимизировать) ОС официальным образом, задокументированным Microsoft, ничего не сломав и не обещая мнимое увеличение производительности, чем грешат аналогичные программы, вводя целенаправленно пользователей в заблуждение.

После бесконечных правок мы хотим показать вам SophiApp — графический наследних Sophia Script for Windows: бесплатная и полностью опенсорная программа для тонкой настройки Windows 10 и Windows 11.

К сожалению, она все еще далеко не идеальна, и уже пришло понимание, что нужна версия 2.0 с более современным UI и UX, но первый блин, вроде как, не оказался комом.

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

Скачать

И для любителей CLI: скачать всегда самую последнюю версию SophiApp, распаковать, удалить архив и открыть папку с программой автоматически. Просто вставьте команду в PowerShell (можно без прав администратора). Программа не будет автоматически запущена.

irm app.sophi.app -useb | iex

Сделали для вас Inestic и я.

Ключевые возможности

  • Динамически отрисовывающийся UI: все элемент НЕ захардкожены;
  • Больше 130 твиков;
  • SophiApp использует паттерн MVVM;
  • Поддержка многопоточности;
  • SophiApp проверяется статическим анализатором, лицензию на который предоставили в PVS-Studio (да, я прямо им писал:));
  • Все билды компилируются в облаки с использованием GitHub Actions. Вы можете сравнить хэш-сумму архива на странице релиза с хэш-суммой в облачной консоли на шаге «Compress Files», чтобы быть уверенным, что архив не подменялся после релиза (для открытия облачных логов вы должны было залогинены в учетную запись GitHub);
  • Приложение отображает текущее состояние каждой функции в UI;
  • Описание к функциям;
  • Имеет встроенный движок поиска по заголовкам и описанию;
  • Программа поддерживает темную и светлую темы. Может менять тему мгновенно в зависимости от выставляемого режима приложений в Windows;
  • Настроить конфиденциальность и телеметрию;
  • Выключить заданий диагностического характера в Планировщике заданий;
  • Настроить UI и персонализацию;
  • Правильно и до конца удалить OneDrive, не нарушив целостность ОС;
  • Удалить UWP-приложения, отображая локализированные имена пакетов. Список приложений рендерится динамически, используя локальные иконки самих приложений. Ничего не захардкожено;
  • Скачать и установить расширение «HEVC Video Extensions from Device Manufacturer» из Microsoft Store с сервера Microsoft, используя парсер от https://store. rg-adguard. net, чтобы появилась возможность открывать файлы формата. heic и. heif;
  • Создать задание «Windows Cleanup« по очистке неиспользуемых файлов и обновлений Windows в Планировщике заданий. Перед началом очистки всплывет нативный тост, где вы сможете выбрать отложить ли, отменить или запустить задание;
  • Создать задание «SoftwareDistribution» по очистке папок %SystemRoot% SoftwareDistributionDownload и %TEMP% в Планировщике заданий;
  • Настроить безопасность Windows;
  • Огромное количество твиков по кастомизации проводника и контекстного меню;
  • Все настройки проводятся задокументированными возможностями ОС, что исключает шанс навредить работоспособности системе.

Системные требования

  • Windows 10 2004/20H2/21H1/21H2 x64;
  • Windows 11 21H2;
  • Windows 11 Insider Preview (Beta- и Dev-каналы) (22509+).
  • Чтобы запустить SophiApp, вы должны быть единственным вошедшим пользователем с права администратора на ПК
  • Правильная работоспособность программы гарантируется лишь в при использовании оригинального образа ОС. SophiApp может не работать на сборках Windows. Особенно если сборка была сделана сборщиками, которые целенаправленно ломают Microsoft Defender и выключает телеметрию, удаляя с корнем системные компоненты. То же касается и сторонних твикеров.
  • Необходимы сборки 1151 и 556 (и выше) для Windows 10 и Windows 11 соответственно.
  • Некоторые функции зависят от доступа в интернет. При отсутствии последнего соответствующие функции будут скрыты в UI до тех пор, пока не появится доступ;
  • Вы можете включить скрытые функции в UI, включив «Расширенные настройки» в Настройках программы. Скрытые функции будут помечены соответствующей шестеренкой;
  • После закрытия SophiApp будет автоматически создан лог-файл, который можно прикрепить, если возникла проблема, чтобы помочь нам понять, что пошло не так. Лог-файл не содержит никакую персональную информацию.

При запуске будет проведена проверка на наличие проблем в ОС, о чем пользователь будет уведомлен.

  • Некоторые функции зависят от доступа в интернет. При отсутствии последнего соответствующие функции будут скрыты в UI до тех пор, пока не появится доступ;
  • Вы можете включить скрытые функции в UI, включив «Расширенные настройки» в Настройках программы. Скрытые функции будут помечены соответствующей шестеренкой;
  • После закрытия SophiApp будет автоматически создан лог-файл, который можно прикрепить, если возникла проблема, чтобы помочь нам понять, что пошло не так. Лог-файл не содержит никакую персональную информацию.

Скриншоты

Когда нечего делать и добавляешь пульсирующее SVG-сердце

Локализация

Кроме русского, SophiApp переведена носителями на английский, украинский, немецкий и итальянский языки.

Журнал изменений

  • SophiApp. exe
  • Microsoft. Deployment. WindowsInstaller. dll
  • Microsoft. Dism. dll
  • Microsoft. Win32.TaskScheduler. dll
  • Microsoft. Win32.TaskScheduler. resources. dll
  • Newtonsoft. Json. dll
  • System. Management. Automation. dll
  • Windows. winmd

Если вам интересны новости ИТ и технологий из первоисточников на английском, можете подписать на мой новостной канал Sophia News, а обсудить их в чате Sophia Chat, где можно задать вопросы по SophiApp, Sophia Script, ПК, ОС, а также попросить написать код для автоматизации чего-либо на PowerShell.

Все баги и пожелания можете оставлять здесь или создать Issue на GitHub.

This page also in:

Sophia Script for Windows

Sophia Script





Telegram
Telegram

Discord


 

 

 

 

 

 

 

 

 

 

 




Donations

System Requirements

Screenshots

Videos

Key features

How to use

How to translate

SophiApp

Changelog

About Sophia Script

Typing SVG

Note: Sophia Script for Windows is the largest PowerShell module on GitHub for Windows 10 & Windows 11 fine-tuning and automating the routine tasks. It offers more than 150 unique tweaks, and shows how Windows can be configured without making any harm to it.

Before running

Note: Due to the fact that the script includes more than 150 functions with different arguments, you must read the entire Sophia.ps1 carefully and comment out/uncomment those functions that you do/do not want to be executed (without need to edit the code), or use Wrapper. Every tweak in the preset file has its’ corresponding function to restore the default settings. Running the script is best done on a fresh install because running it on wrong tweaked system may result in errors occurring.

Donations


ko-fi
USDT (TRC20)
TQtMjdocUWbKAeg1kLtB4ApjAVHt1v8Rtf

System Requirements

Version Marketing name Build Arch Editions
Windows 11 Insider Preview 23H2 2023 Update 22509+ Home/Pro/Enterprise
Windows 11 22H2 2022 Update 22621.963+ Home/Pro/Enterprise
Windows 11 21H2 22000.1335+ Home/Pro/Enterprise
Windows 10 22H2 2022 Update 19045.2364+ x64 Home/Pro/Enterprise
Windows 10 21H2 October 2021 Update 19044.2364+ x64 Home/Pro/Enterprise
Windows 10 21H2 Enterprise LTSC 2021 October 2021 Update 19044.2364+ x64 Enterprise
Windows 10 1809 Enterprise LTSC 2019 October 2018 Update 17763.3770+ x64 Enterprise

Warning

  • It’s allowed to be logged in as one admin user only during application startup.
  • 🔥🔥🔥Sophia Script for Windows may not work on a homebrew Windows. Especially, if the homebrew image was created by OS makers being all thumbs who break Microsoft Defender and disable OS telemetry by purposely uprooting system components

Key features

  • Set up Privacy & Telemetry;
  • Enable DNS-over-HTTPS for IPv4;
  • Turn off diagnostics tracking scheduled tasks with pop-up form written in WPF;
  • Set up UI & Personalization;
  • Uninstall OneDrive «correctly»;
  • Interactive prompts;
  • The TAB completion for functions and their arguments (if using the Functions.ps1 file);
  • Change %TEMP% environment variable path to %SystemDrive%Temp;
  • Change location of the user folders programmatically (without moving user files) within interactive menu using arrows to select a drive
    • «Desktop»
    • «Documents»
    • «Downloads»
    • «Music»
    • «Pictures»
    • «Videos»
  • Install free (light and dark) «Windows 11 Cursors Concept v2» cursors from Jepri Creations on-the-fly;
  • Uninstall UWP apps displaying packages names;
    • Generate installed UWP apps list dynamically
  • Restore the default uninstalled UWP apps for current user displaying localized packages names;
  • The TAB autocompletion for function and its’ arguments by typing first letters;
  • Disable Windows features displaying friendly packages names with pop-up form written in WPF;
  • Uninstall Windows capabilities displaying friendly packages names with pop-up form written in WPF;
  • Download and install the HEVC Video Extensions from Device Manufacturer to be able to open .heic and .heif formats;
  • Register app, calculate hash, and set as default for specific extension without the «How do you want to open this» pop-up using special function;
  • Install any supported Linux distrobution for WSL displaying friendly distro names with pop-up form written in WPF;
  • Create a Windows Cleanup and Windows Cleanup Notification scheduled tasks for Windows cleaning up unused files and updates;
    • A native toast notification will be displayed where you can choose to snooze, run the cleanup task or dismiss
  • Create tasks in the Task Scheduler to clear
    • %SystemRoot%SoftwareDistributionDownload
    • %TEMP%
  • Pin shortcuts to Start via pure PowerShell
    • Three shortcuts are pre-configured to be pinned: Control Panel, «old style» Devices and Printers, and Windows PowerShell
  • Unpin all Start menu tiles;
  • Turn on Controlled folder access and add protected folders using dialog menu;
  • Add exclusion folder from Microsoft Defender Antivirus scanning using dialog menu;
  • Add exclusion file from Microsoft Defender Antivirus scanning using dialog menu;
  • Refresh desktop icons, environment variables and taskbar without restarting File Explorer;
  • Configure the Windows security;
  • Many more File Explorer and context menu «deep» tweaks.

Screenshots

The TAB autocomplete. Read more here

Image

Change user folders location programmatically using the interactive menu

Image

Localized UWP packages names

Image Image

Localized Windows features names

Image Image

Download and install any supported Linux distribution in automatic mode

Image

Native interactive toasts for the scheduled tasks

Image

@BenchTweakGaming Sophia Script Wrapper

Wrapper

Videos

YT

YT YT

How to use

  • Choose the right script version for your Windows;

  • Download up-to-date version;

  • Expand the archive;

  • Open folder with the expanded archive;

  • Look through the Sophia.ps1 file to configure functions that you want to be run;

    • Place the «#» char before function if you don’t want it to be run.
    • Remove the «#» char before function if you want it to be run.
  • On Windows 10 click File in File Explorer, hover over Open Windows PowerShell, and select Open Windows PowerShell as Administrator (how-to with screenshots)

  • On Windows 11 right-click on the Windows icon and select Windows Terminal (Admin). Then change the current location

    Set-Location -Path "PathToSophiaFolder"
  • Set execution policy to be able to run scripts only in the current PowerShell session

    Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
  • Type .Sophia.ps1 Enter to run the whole preset file.

How to use Wrapper

  • Download and expand the archive;
  • Run SophiaScriptWrapper.exe and import Sophia.ps1;
    • The Wrapper has a real time UI rendering;
  • Configure every function;
  • Open the Console Output tab and press Run PowerShell.

How to run the specific function(s)

To run the specific function(s) dot source the Functions.ps1 file first:

# With a dot at the beginning
. .Functions.ps1
  • Now you can do like this (the quotation marks required)
Sophia -Functions<kbd>TAB</kbd>
Sophia -Functions temp<kbd>TAB</kbd>
Sophia -Functions unin<kbd>TAB</kbd>
Sophia -Functions uwp<kbd>TAB</kbd>
Sophia -Functions "DiagTrackService -Disable", "DiagnosticDataLevel -Minimal", UninstallUWPApps

UninstallUWPApps, "PinToStart -UnpinAll"

Or use an old-style format without the TAB functions autocomplete (the quotation marks required)

.Sophia.ps1 -Functions CreateRestorePoint, "ScheduledTasks -Disable", "WindowsCapabilities -Uninstall"

How to download Sophia Script via PowerShell

  • Download the always latest Sophia Script archive by invoking (not as administrator too) in PowerShell
irm script.sophi.app -useb | iex
  • The command will download and expand the latest Sophia Script archive (without running) according which Windows and PowerShell versions it is run on. If you run it on, e.g., Windows 11 via PowerShell 5.1, it will download Sophia Script for Windows 11 PowerShell 5.1.

How to translate

  • Get your OS UI culture by invoking $PSUICulture in PowerShell;
  • Create a folder with the UI culture name;
  • Place your localized Sophia.psd1 file into this folder.

Media

  • Discord
  • Telegram discussion group
  • Telegram channel
  • Ru-Board
  • rutracker
  • My Digital Life
  • 4sysops
  • gHacks Technology News
  • Neowin: Tech News, Reviews & Betas
  • Comss.ru
  • Habr
  • Deskmodder.d
  • PCsoleil Informatique
  • Reddit (archived)
    • PM me

SophiApp Community Edition (C# + WPF)

SophiApp is in active development 🚀

Image
Image

Я от лица команды хочу показать вам SophiApp — графический наследник Sophia Script for Windows: бесплатная, портативная и полностью опенсорная программа для тонкой настройки Windows 10 и Windows 11.

В этой статье я расскажу, как оброненная мной фраза в комментарии 3 года назад под моей статьей из цикла про тонкую настройку Windows развернула мою жизнь на 180°, а чуть позже — и еще одного человека.

Все это время у меня была идея сделать графическую версию моего модуля на PowerShell, чтобы показать пользователям, каким должен быть современный твикер для Windows, какие функции может в себе нести, а главное — посыл программы: настроить (а не оптимизировать) ОС официальным образом, задокументированным Microsoft, ничего не сломав и не обещая мнимое увеличение производительности, чем грешат аналогичные программы, целенаправленно вводя пользователей в заблуждение.

Уже есть идеи насчет версии 2.0 с более современными UI а-ля Windows 11 и UX, а также расширенной функциональностью, но первый блин, вроде как, не оказался комом. Программа все это время делалась на голом энтузиазме, и мы искренне хотим, чтобы пользователи Windows перестали воспринимать так называемые твикеры как что-то по определению вредное, не несущее пользы, а узнали, как можно настроить современные Windows 10 и 11 и что они в себе таят.

Как появилась идея программы, и знакомство с Дмитрием

Как-то летом 2019 года в моей первой статье Скрипт настройки Windows 10 в ответ на предложение о создании графической версии моего PowerShell-скрипта я посетовал, что PowerShell-грамоте не обучены мы, но есть желание что-нибудь сотворить. На тот момент знания в PowerShell-ремесле были скудны (как и сейчас), потому максимум, на что я рассчитывал, — сварганить что-нибудь на Windows Forms, как делают многие на GitHub. Но вдруг 3 сентября 2019 года в личные сообщения на Хабре мне написал некто, представившись Дмитрием (старый аккаунт на Хабре, GitHub), с предложением сделать то, о чем я мечтал! Сказать, что я был удивлен, что кто-то откликнулся мне помочь, — ничего не сказать. Как выяснилось, он уже собаку съел на такого рода GUI-окнах с кнопками, так как это была часть его работы. А показав нам реальные примеры своих работ, он укрепил меня во мнении, что у нас все получится. Ну, скажем, месяца за 2—3. Кто бы мог помыслить, во что это все выльется для нас обоих…

Что не так с «рынком» твикеров

Наверное, надо немного отвлечься и затронуть тему особенности «рынка» так называемых твикеров для Windows. Фундаментально все программы такого назначения можно разделить на 2 категории:

  1. Настраивают внешний вид ОС;

  2. Вмешиваются в работу ОС (и иногда ломая ее работоспособность на корню):

    1. Удаление Microsoft Defender, вырывая его с корнем из системы;

    2. Удаление несчастных UWP-приложений, варварски выкорчевывая файлы из %ProgramFiles%WindowsApps;

    3. Отключение получения обновлений через Центр обновления Windows.

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

Но это все крайности. В основном, когда выходит очередной обзор такого рода программы на YouTube, на превью-картинку ставится текст, что во всех играх у вас повысятся до 300 FPS (вне зависимости от текущих характеристик ПК) и также обязательно употребляется слово «оптимизация». 

В случае с англоязычным сегментом интернета обязательно употребляются «debloat» или «debotnet», намекая, что Windows состоит чуть менее, чем полностью из ненужных программ. Ведь только разработчики такого рода программ знают, что Windows «из коробки» работает нестабильно, а Microsoft скрывает от нас секретные ключи реестра, которые-то и сделают из вашего ПК ракету. И вообще всему виной, по их мнению, Microsoft Defender, сжирающий МБ ОЗУ, предустановленные UWP-приложения и логи, создаваемые бесчисленными сборщиками из Просмотрщика событий, — практически всадники Апокалипсиса!

Пользователи, недовольные быстродействием Windows

Пользователи, недовольные быстродействием Windows

Такого рода действия могут совершаться по следующим причинам:

  1. Привлечение внимания пользователей, у которых в большинстве своем могут быть не самые мощные ПК;

  2. Искренняя убежденность в правильности своих действий в силу отсутствия знаний о работе Windows;

  3. Целенаправленное введение в заблуждение пользователей с целью создания вокруг себя ауры гуру в вопросах работы Windows и того, как ее «ускорить»;

  4. Распространение зловредных программ с целью извлечения прибыли от доверчивых пользователей.

Первые попытки на PowerShell, или осознание, что надо писать на C#

Мы с Дмитрием быстро нашли общий язык, и, обговорив вектор разработки, я объяснил, как работают функции в скрипте, чтобы он перенес их в графику.

Долго ли, коротко ли, но уже к концу сентября, когда количество строк кода в его PowerShell-скрипте перевалило за 20 000, powershell.exe встал колом: запуск уже занимал около 10 секунд, и никто не понимал, что там написано и как это работает. Надо было идти дальше. Но куда? Мы явно не рассчитали ни наши силы, ни знания, ни время, необходимое на такой проект. Ответ родился сам по себе: я позвонил Дмитрию и робко предложил ему написать программу на чистом C#. Судя по звукам, которые он начал издавать, я подумал, случилось примерно следующее:

Он не отрицал, что пишет иногда для себя простенькие консольные программы на C# для облегчения своей работы, но это не входит в его круг обязанностей — это как хобби, и он не потянет. Уж не знаю, какими словами, но я убедил его попробовать. Тут же встала новая проблема: как на предыдущем GUI-приложении не напихаешь кнопок — тут нужен настоящий дизайн программы! Наверное, именно в то время Дмитрий начал догадываться, что его втягивают в какую-то авантюру.

Такого твикера не дай бог никому! Кадры из к/ф Ширли-мырли

Такого твикера не дай бог никому! Кадры из к/ф Ширли-мырли
Страшные наброски 3000

Все прочие скриншоты с видео утрачены или удалены, и никто уже не увидит, как плохо у нас все выглядело. :)

Где-то к июню 2020 мы окончательно признались себе, что ничего у нас не выйдет с таким подходом, и надо заказывать у какого-нибудь фрилансера UI с нормальным, проработанным UX. И вот впервые нам улыбнулась удача, когда на сайте фрилансеров мы наткнулись на Владимира.

Не будем заострять внимание на этой итерации разработки, так как и она потерпела крах даже с привлеченным разработчиком интерфейсов. Вся проблема в том, что если ты сам до конца не понимаешь, что тебе надо, то и результат будет соответствующий. После получения готового макета в Zeplin наша эйфория длилась недолго: его вариант даже нельзя было сравнивать с нашими потугами, но все разбилось о скалы «незакладывания масштабирования». Мы не учли столько вещей, что было даже стыдно признаться ему, что по сути надо все переделывать. Но осознание провала еще не накрыло нас, и мы барахтались с тем вариантом дизайна еще где-то до декабря 2020, когда пришло окончательно понимание, что так больше не может продолжаться.

В декабре 2020 в третий раз мы закинули невод с твердым намерением завершить проект во что бы то ни стало! Учтя все недостатки предыдущего дизайна (так считали), мы вновь составили техническое задание для Владимира, надеясь на богов верхней реки, что на этот-то раз у нас все получится.

Дмитрий: Ah shit, here we go again

Дмитрий: Ah shit, here we go again

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

Текущая версии SophiApp и то, как она работает

Полномочия в команде мы разделили следующим образом: на мои плечи возложено было написание всех логически верных проверок на PowerShell, чтобы Дмитрий мог в дальнейшем понять, как выставлять чекбоксы в интерфейсе, то бишь, когда ложь, а когда истина. Кроме того, перевод интерфейса на английский язык, тестирование сборок, PR, написание начальных проверок и проверок для определения работоспособности Microsoft Defender (чтобы отсеять пользователей, у которых он сломан или сломан кэш WMI), логика работы каждой функции. Дмитрию же достались написание кода и отладка.

Стоит заострить внимание, почему мы так трепетно относимся к проверке версии сборки Windows и работоспособности Microsoft Defender. На самом деле все достаточно банально: как показала практика поддержки моего скрипта Sophia Script for Windows (более 500 000 скачиваний за 2,5 года, а также более 5 000 звезд на GitHub), есть достаточная прослойка пользователей, которые целенаправленно ломают Windows, используя сомнительные программы, с целью  выключения встроенного антивируса или его полного вырезания из системы. Все опять же растет из YouTube, где нечистые на руку блогеры специально ведут риторику о том, что все беды в ОС от наличия в ней Microsoft Defender. 

Другая крайность, с которой мы столкнулись, — это отказ некоторых пользователей вообще обновлять их Windows, так как они уверены (опять же с подачи блоггеров), что обновления к ОС выходят каждый день, и их надо срочно отключить. Эти два фактора напрямую влияют, какой фидбек мы получаем от пользователя после использования SophiApp. И чем сильнее укрепляется в вере пользователь, что Defender нужно сломать, а ОС никогда не обновлять, тем больше ошибок возникает в работе нашей программы.

С учетом этих вводных, волевым усилием было принято решение где-то раз в полгода повышать требование к минорной версии билда Windows. На текущий момент это 1904x.1766+ для Windows 10 и 22000.739+, 22509+ для Windows 11 и Windows 11 Insider Preview соответственно.

То же касается и проверки через интернет, последняя ли версия программы запущена: в каждом билде исправляются ошибки (и, конечно, добавляются новые), потому мы хотим предоставить лучший опыт использования пользователям. Для этого программа не только уведомляет об обнаружении новой версии, но и блокирует текущую, если ее версия ниже, чем уже имеется. А проверка осуществляется достаточно примитивно. Как у многих софтверных компаний в облаке хранится JSON-файл, где прописываются последние версии для стабильной ветки и для бета-версии.

Итак, мы плавно подходим к описанию того, как работает под капотом SophiApp, но сначала напомню особенности программы:

  • Динамически отрисовывающийся UI: все элементы НЕ захардкожены;

  • 25 000+ строк кода (не считая JSON-конфигов);

  • Более 130 твиков;

  • Копировать описания функций через ПКМ;

  • Переведена носителями на английский, украинский, немецкий, итальянский, французский, чешский и турецкий языки;

  • SophiApp использует паттерн MVVM;

  • Поддержка многопоточности;

  • SophiApp проверяется статическим анализатором, лицензию на который любезно предоставили в PVS-Studio;

  • Все билды компилируются в облаке с использованием GitHub Actions (конфиг). Вы можете сравнить хэш-сумму архива на странице релиза с хэш-суммой в облачной консоли на шаге «Compress Files», чтобы быть уверенным, что архив не подменялся после релиза (для открытия облачных логов вы должны войти в вашу учетную запись GitHub);

  • Описание к функциям при наведении курсора на функцию;

  • Имеет встроенный движок поиска по заголовкам и описанию;

  • Программа поддерживает темную и светлую темы. Может менять тему мгновенно в зависимости от выставленного режима приложений в Windows;

  • Настроить конфиденциальность и телеметрию;

  • Выключить задания диагностического характера в Планировщике заданий;

  • Настроить UI и персонализацию;

  • Правильно и до конца удалить OneDrive, не нарушив целостность ОС;

  • Удалить UWP-приложения, отображая локализованные имена пакетов. Список приложений рендерится динамически, используя локальные иконки самих приложений. Ничего не захардкожено;

  • Скачать и установить расширение HEVC Video Extensions from Device Manufacturer, чтобы появилась возможность открывать файлы формата .heic и .heif;

  • Создать задание «Windows Cleanup» по очистке неиспользуемых файлов и обновлений Windows в Планировщике заданий. Перед началом очистки всплывет нативный тост, где вы сможете выбрать: отложить, отменить или запустить задание;

  • Создать задание «SoftwareDistribution» по очистке папок %SystemRoot% SoftwareDistributionDownload и %TEMP% в Планировщике заданий;

  • Настроить безопасность Windows;

  • Программа полностью портативная: в реестре не сохраняются никакие специальные ключи, а после закрытия чистится лог .NET Framework от программы;

  • Огромное количество твиков по кастомизации проводника и контекстного меню;

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

Системные требования

  • Windows 10 2004/20H2/21H1/21H2/22H2 x64;

    • Билд 1904x.1706+.

  • Windows 11 21H2/22H2/23H2;

    • 22000.739+, 22509+.

  • Чтобы запустить SophiApp, вы должны быть единственным вошедшим пользователем с правами администратора на ПК;

  • Правильная работоспособность программы гарантируется лишь при использовании оригинального образа ОС. SophiApp может не работать на сломанных сборках Windows;

  • Некоторые функции зависят от доступа в интернет. При отсутствии последнего соответствующие функции будут скрыты в UI до тех пор, пока не появится доступ;

  • Вы можете включить скрытые функции в UI, включив «Расширенные настройки» в Настройках программы. Скрытые функции будут помечены соответствующей шестеренкой;

  • После закрытия SophiApp будет автоматически создан лог-файл, который можно прикрепить, если возникла проблема, чтобы помочь нам понять, что пошло не так.

Сторонние библиотеки

  • Json.NET

  • TaskScheduler

  • ManagedDism

  • wix3

Много скриншотов!

Передаю слово Дмитрию, который и написал SophiApp.

Здравствуйте. У меня нет какого-то опыта в написании статей, но постараюсь описать, как мы пришли к идее принципа работы SophiApp в том виде, в котором она сейчас и работает. Жаль, что нельзя, как математики в древней Индии, просто дать ссылку на папку с кодом на GitHub и подписать: «Смотри!». В общем по мере возможности я буду приводить примеры кода, того, как реализован тот или иной аспект работы программы.

В сумме SophiApp мной переписывалась 5 раз с нуля, и каждый раз я был готов бросить сию затею, так как нервы дороже. Но, как видите, мы живы, и программа работает. :)  

Мое перманентное состояние в начале разработки

Мое перманентное состояние в начале разработки

В начале этой истории мне почему-то казалось, что максимально правильно будет не использовать сторонние библиотеки UI, а делать все средствами WPF. К тому же дизайн программы не подразумевал стандартных элементов UI — все должно быть нестандартно, стильно и вызывать wow-эффект. И вообще в программе не используются какие-то особые хаки или ноу-хау. Все достаточно приземленно выглядит.

Пришлось с нуля изучать стилизацию и анимации в WPF. Простой переключатель (switch) я делал неделю, перечитав множество тем на StackOverflow десятилетней давности и испортив тонны кода. А когда он заработал — Дмитрий «обрадовал» меня тем, что все элементы должны поддерживать две темы: тёмную и светлую, и темы должны иметь возможность переключаться «на лету».

Премного благодарен

Премного благодарен

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

Думаю, если бы я не пришел к пониманию, что нужна поддержка шаблона MVVM, то еще бы долго и упорно копал не туда. Сначала я очень скептически отнесся к этой идее: «Зачем усложнять и без того сложный код?». Но после тестового приложения все встало на свои места, и я снова переписал SophiApp, добавив поддержку MVVM и заодно RelayCommand для элементов интерфейса. Самое лучшее в коде — это то, что его всегда можно переписать!

This is fine.

This is fine.

Для того чтобы проверить, как будет выглядеть программа «вживую», я сделал специальный дебаг-билд, который считывал из главного JSON-файла названия, описания и тип элементов, и отрисовывал их в интерфейсе. Этот файл послужил основой для текущей версии SophiApp. В папке рядом с исполняемым файлом лежал JSON-файл, и при редактировании последнего без перекомпиляции исполняемого файла программа отрисовывала новые элементы интерфейса, их тип и описание к заголовкам и кнопкам. Это надолго заняло Дмитрия созданием и редактированием текста на русском и английском языках, заодно обогатив его жизненный опыт тонкостями различий между флажком (checkbox) и радиокнопкой (radiobutton) и т. п. Как оказалось, емко и грамотно сформулировать описание ко всем функциям достаточно тяжело, не скатываясь в популизм и не опускаясь до уровня фраз и словечек вроде «выпилить телеметрию», «бессовестное поведение Microsoft», «шпионский модуль», «назойливый Центр безопасности» и прочего, не относящегося к работе Windows. Кстати, все фразы — выдержки из реальных программ.

Так как в приложении много текста, его нужно было как-то хранить. Выбор ожидаемо пал на JSON. JSON — это модно и молодежно, думали мы. Так оно и есть, когда его используют рационально, у нас получился огромный файл, где хранятся все локализации, описания и заголовки ко всем функциям. Огромное преимущество в использовании такого подхода было в том, что его удобно парсить — хоть тем же PowerShell, но про минусы мы узнали, когда нам стали предлагать переводы интерфейса SophiApp. И тут стало понятно, что никого палкой не заставишь вписывать сотни новых строк в этот огромный файл! Выход виделся лишь один: искусственно разбить единый файл на множество маленьких файлов под каждую локализацию, чтобы человек мог перевести файл только с английской локализацией или улучшить уже существующий. Сказано — сделано.

Выбор пал на Json.NET, так как это де-факто стандарт парсинга JSON. Благодаря библиотеке, парсим и превращаем JSON в объекты:

private async Task DeserializeTextedElementsAsync()
{
    await Task.Run(() =>
    {
        var deserializedElements = JsonConvert.DeserializeObject<IEnumerable<TextedElementDto>>Encoding.UTF8.GetString(Properties.Resources.UIData))
                                              .Where(dto => IsWindows11 ? dto.Windows11Supported : dto.Windows10Supported)
                                              .Select(dto => FabricHelper.CreateTextedElement(dto: dto, errorHandler: OnTextedElementErrorAsync, statusHandler: OnTextedElementStatusChanged, language: Localization.Language))
                                              .OrderByDescending(element => element.ViewId);
        TextedElements = new ConcurrentBag<TextedElement>(deserializedElements);
    });
}

Все было безветренно, пока не встал вопрос: «как добавить новый перевод в главный файл». На этот раз на помощь пришел PowerShell. В данном примере показывается, как можно интегрировать турецкую локализацию в основной JSON-файл.

# Compare 2 JSONs and merge them into one
Remove-TypeData System.Array -ErrorAction Ignore

$Parameters = @{
	Uri             = "https://raw.githubusercontent.com/Sophia-Community/SophiApp/master/SophiApp/SophiApp/Resources/UIData.json"
	UseBasicParsing = $true
}
$Full = Invoke-RestMethod @Parameters

$Parameters = @{
	Uri             = "https://raw.githubusercontent.com/Sophia-Community/SophiApp/master/SophiApp/SophiApp/Localizations/UIData_TR.json"
	UseBasicParsing = $true
}
$Translation = Invoke-RestMethod @Parameters

# In this case we add Turkish translation
$ID = "TR"

$Full | ForEach-Object -Process {
	$UiData = $_
	$Data = $Translation | Where-Object -FilterScript {$_.Id -eq $UiData.Id}

	$UiData.Header | Add-Member -Name $ID -MemberType NoteProperty -Value $Data.Header.$ID -Force
	$UiData.Description | Add-Member -Name $ID -MemberType NoteProperty -Value $Data.Description.$ID -Force
	
	if ($UiData.ChildElements)
	{
		$UiData.ChildElements | ForEach-Object -Process {
			$UiChild = $_
			$Child = $Data.ChildElements | Where-Object -FilterScript {$_.Id -eq $UiChild.Id}

			$UiChild.ChildHeader | Add-Member -Name $ID -MemberType NoteProperty -Value $Child.ChildHeader.$ID -Force
			$UiChild.ChildDescription | Add-Member -Name $ID -MemberType NoteProperty -Value $Child.ChildDescription.$ID -Force
		}
	}
}

ConvertTo-Json -InputObject $Full -Depth 4 | ForEach-Object -Process {$_.Replace("u0027", "'")} | Set-Content -Path "D:3.json" -Encoding UTF8 -Force

# Re-save in the UTF-8 without BOM encoding due to JSON must not has the BOM: https://datatracker.ietf.org/doc/html/rfc8259#section-8.1
Set-Content -Value (New-Object -TypeName System.Text.UTF8Encoding -ArgumentList $false).GetBytes($(Get-Content -Path "D:3.json" -Raw)) -Encoding Byte -Path "D:3.json" -Force

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

После этих изменений в разработке образовалась — так любимая всеми нами — стабильность. Добавлялись новые фичи, фиксились и вносились баги. Появились люди, которые стали скачивать и запускать тестовые билды, делясь своими предложениями и впечатлениями. После нескольких сеансов общения далеко за полночь по Москве с кем-то из другого полушария стало понятно, что нужно фиксировать, как и с какими данными работает приложение. Другими словами, нужен был лог работы программы.

Hidden text

Windows 11 Pro 21H2 build 22000.856
Computer name: DESKTOP-B3E2G5O
User: Sanctuary
User domain: DESKTOP-B3E2G5O
User culture: Russian (Russia)
User region: Russia
App version: 1.0.77.0
App is release: False
App folder: "D:DownloadsSophiApp"
App localization: RU
App theme: DARK
App has access to Internet: True
Release version is available: 1.0.77
Pre-release version is available: 1.0.77
No update required

An error occured in element: 313
Information: PC is not domain-joined
The method that caused the error: SophiApp.Customisations.CustomisationStatus

An error occured in element: 502
Information: The UWP package MicrosoftTeams wasn't found in OS
The method that caused the error: SophiApp.Customisations.CustomisationStatus

An error occured in element: 230
Information: The UWP package MicrosoftWindows.Client.WebExperience wasn't found in OS
The method that caused the error: SophiApp.Customisations.CustomisationStatus

An error occured in element: 262
Information: Unsupported Windows edition
The method that caused the error: SophiApp.Customisations.CustomisationStatus

An error occured in element: 601
Information: The UWP package Microsoft.XboxGamingOverlay or Microsoft.GamingApp wasn't found in OS
The method that caused the error: SophiApp.Customisations.CustomisationStatus

An error occured in element: 501
Information: The UWP package Microsoft.549981C3F5F10 wasn't found in OS
The method that caused the error: SophiApp.Customisations.CustomisationStatus

An error occured in element: 349
Information: OneDrive is not installed on this PC
The method that caused the error: SophiApp.Customisations.CustomisationStatus

An error occured in element: 351
Information: The latest version of Visual C++ Redistributable 2015–2022 x64 is installed
The method that caused the error: SophiApp.Customisations.CustomisationStatus

An error occured in element: 354
Information: .Net version 6.0.8 already installed on this PC
The method that caused the error: SophiApp.Customisations.CustomisationStatus

An error occured in element: 357
Information: .Net version 6.0.8 already installed on this PC
The method that caused the error: SophiApp.Customisations.CustomisationStatus

The 100 element was initialized in 0,019 second(s)
The 101 element was initialized in 0,001 second(s)
The 104 element was initialized in 0,004 second(s)
The 105 element was initialized in 0,000 second(s)
The 108 element was initialized in 0,015 second(s)
The 118 element was initialized in 0,000 second(s)
The 119 element was initialized in 0,000 second(s)
The 120 element was initialized in 0,000 second(s)
The 121 element was initialized in 0,000 second(s)
The 122 element was initialized in 0,000 second(s)
The 123 element was initialized in 0,000 second(s)
The 124 element was initialized in 0,000 second(s)
The 125 element was initialized in 0,000 second(s)
The 126 element was initialized in 0,000 second(s)
The 127 element was initialized in 0,000 second(s)
The 200 element was initialized in 0,003 second(s)
The 204 element was initialized in 0,000 second(s)
The 205 element was initialized in 0,000 second(s)
The 206 element was initialized in 0,000 second(s)
The 207 element was initialized in 0,000 second(s)
The 208 element was initialized in 0,000 second(s)
The 212 element was initialized in 0,000 second(s)
The 213 element was initialized in 0,000 second(s)
The 214 element was initialized in 0,000 second(s)
The 215 element was initialized in 0,000 second(s)
The 216 element was initialized in 0,000 second(s)
The 220 element was initialized in 0,000 second(s)
The 222 element was initialized in 0,000 second(s)
The 223 element was initialized in 0,000 second(s)
The 224 element was initialized in 0,000 second(s)
The 227 element was initialized in 0,000 second(s)
The 229 element was initialized in 0,000 second(s)
The 230 element was initialized in 0,075 second(s)
The 241 element was initialized in 0,000 second(s)
The 242 element was initialized in 0,001 second(s)
The 246 element was initialized in 0,000 second(s)
The 249 element was initialized in 0,000 second(s)
The 253 element was initialized in 0,000 second(s)
The 254 element was initialized in 0,000 second(s)
The 257 element was initialized in 0,000 second(s)
The 258 element was initialized in 0,000 second(s)
The 259 element was initialized in 0,000 second(s)
The 260 element was initialized in 0,000 second(s)
The 261 element was initialized in 0,000 second(s)
The 262 element was initialized in 0,001 second(s)
The 268 element was initialized in 0,007 second(s)
The 300 element was initialized in 0,002 second(s)
The 301 element was initialized in 0,001 second(s)
The 304 element was initialized in 0,000 second(s)
The 305 element was initialized in 0,000 second(s)
The 306 element was initialized in 0,000 second(s)
The 309 element was initialized in 0,000 second(s)
The 310 element was initialized in 0,000 second(s)
The 311 element was initialized in 0,000 second(s)
The 312 element was initialized in 0,000 second(s)
The 313 element was initialized in 0,007 second(s)
The 314 element was initialized in 0,000 second(s)
The 315 element was initialized in 0,146 second(s)
The 316 element was initialized in 0,030 second(s)
The 319 element was initialized in 0,000 second(s)
The 320 element was initialized in 0,077 second(s)
The 321 element was initialized in 0,000 second(s)
The 324 element was initialized in 0,000 second(s)
The 327 element was initialized in 0,000 second(s)
The 330 element was initialized in 0,000 second(s)
The 331 element was initialized in 0,000 second(s)
The 332 element was initialized in 0,000 second(s)
The 333 element was initialized in 0,000 second(s)
The 334 element was initialized in 0,000 second(s)
The 335 element was initialized in 0,000 second(s)
The 336 element was initialized in 0,000 second(s)
The 337 element was initialized in 0,000 second(s)
The 338 element was initialized in 0,000 second(s)
The 339 element was initialized in 0,005 second(s)
The 340 element was initialized in 0,000 second(s)
The 341 element was initialized in 0,000 second(s)
The 342 element was initialized in 0,013 second(s)
The 347 element was initialized in 0,002 second(s)
The 350 element was initialized in 0,241 second(s)
The 353 element was initialized in 1,921 second(s)
The 356 element was initialized in 0,576 second(s)
The 500 element was initialized in 0,018 second(s)
The 501 element was initialized in 0,004 second(s)
The 502 element was initialized in 0,081 second(s)
The 503 element was initialized in 0,001 second(s)
The 600 element was initialized in 0,002 second(s)
The 601 element was initialized in 0,097 second(s)
The 602 element was initialized in 0,025 second(s)
The 700 element was initialized in 0,020 second(s)
The 701 element was initialized in 0,001 second(s)
The 702 element was initialized in 0,002 second(s)
The 800 element was initialized in 0,051 second(s)
The 801 element was initialized in 0,012 second(s)
The 803 element was initialized in 0,173 second(s)
The 804 element was initialized in 0,043 second(s)
The 805 element was initialized in 0,040 second(s)
The 806 element was initialized in 0,000 second(s)
The 807 element was initialized in 0,000 second(s)
The 808 element was initialized in 0,013 second(s)
The 809 element was initialized in 0,000 second(s)
The 810 element was initialized in 0,000 second(s)
The 811 element was initialized in 1,138 second(s)
The 812 element was initialized in 0,000 second(s)
The 900 element was initialized in 0,002 second(s)
The 901 element was initialized in 0,000 second(s)
The 902 element was initialized in 0,000 second(s)
The 903 element was initialized in 0,000 second(s)
The 904 element was initialized in 0,000 second(s)
The 914 element was initialized in 0,078 second(s)
The 915 element was initialized in 0,012 second(s)
The 917 element was initialized in 0,000 second(s)
The 918 element was initialized in 0,000 second(s)
The 919 element was initialized in 0,000 second(s)
The 920 element was initialized in 1,193 second(s)
The 923 element was initialized in 0,000 second(s)
The 924 element was initialized in 0,000 second(s)
The 925 element was initialized in 0,000 second(s)
The 926 element was initialized in 0,003 second(s)
The 927 element was initialized in 0,002 second(s)
The 928 element was initialized in 0,000 second(s)

10.08.2022 18:34:40 Debug mode is: False
10.08.2022 18:34:40 Active view is: Loading
10.08.2022 18:34:40 Advanced settings is visible: False
10.08.2022 18:34:40 The "UWP for all users" switch state is: UNCHECKED
10.08.2022 18:34:40 The OS conditions checkings started
10.08.2022 18:34:40 OsVersionCondition run result: True
10.08.2022 18:34:40 The next condition to be run: OsBuildVersionCondition
10.08.2022 18:34:40 OsBuildVersionCondition run result: True
10.08.2022 18:34:40 The next condition to be run: OsFilesCorruptedCondition
10.08.2022 18:34:40 OsFilesCorruptedCondition run result: True
10.08.2022 18:34:40 The next condition to be run: RebootRequiredCondition
10.08.2022 18:34:40 RebootRequiredCondition run result: True
10.08.2022 18:34:40 The next condition to be run: SingleInstanceCondition
10.08.2022 18:34:40 SingleInstanceCondition run result: True
10.08.2022 18:34:40 The next condition to be run: SingleAdminSessionCondition
10.08.2022 18:34:40 SingleAdminSessionCondition run result: True
10.08.2022 18:34:40 The next condition to be run: Win10TweakerCondition
10.08.2022 18:34:40 Win10TweakerCondition run result: True
10.08.2022 18:34:40 The next condition to be run: SycnexScriptCondition
10.08.2022 18:34:40 SycnexScriptCondition run result: True
10.08.2022 18:34:40 The next condition to be run: DefenderCorruptedCondition
10.08.2022 18:34:40 DefenderCorruptedCondition run result: True
10.08.2022 18:34:40 The next condition to be run: NewVersionCondition
10.08.2022 18:34:40 NewVersionCondition run result: True
10.08.2022 18:34:40 This is last condition
10.08.2022 18:34:40 It took 1 second(s) to check the OS conditions
10.08.2022 18:34:40 Active view is: Loading
10.08.2022 18:34:41 Initialization of the elements started
10.08.2022 18:34:41 The 900 element changed status to: CHECKED
10.08.2022 18:34:41 The 600 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 300 element changed status to: CHECKED
10.08.2022 18:34:41 The 901 element changed status to: CHECKED
10.08.2022 18:34:41 The 200 element changed status to: CHECKED
10.08.2022 18:34:41 The 301 element changed status to: CHECKED
10.08.2022 18:34:41 The 902 element changed status to: CHECKED
10.08.2022 18:34:41 The 201 element changed status to: CHECKED
10.08.2022 18:34:41 The 302 element changed status to: CHECKED
10.08.2022 18:34:41 The 202 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 903 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 303 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 904 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 204 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 304 element changed status to: CHECKED
10.08.2022 18:34:41 The 205 element changed status to: CHECKED
10.08.2022 18:34:41 The 305 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 306 element changed status to: CHECKED
10.08.2022 18:34:41 The 307 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 206 element changed status to: CHECKED
10.08.2022 18:34:41 The 308 element changed status to: CHECKED
10.08.2022 18:34:41 The 207 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 208 element changed status to: CHECKED
10.08.2022 18:34:41 The 309 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 209 element changed status to: CHECKED
10.08.2022 18:34:41 The 210 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 310 element changed status to: CHECKED
10.08.2022 18:34:41 The 212 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 311 element changed status to: CHECKED
10.08.2022 18:34:41 The 213 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 312 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 214 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 215 element changed status to: CHECKED
10.08.2022 18:34:41 The 216 element changed status to: CHECKED
10.08.2022 18:34:41 The 217 element changed status to: CHECKED
10.08.2022 18:34:41 The 218 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 220 element changed status to: CHECKED
10.08.2022 18:34:41 The 222 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 223 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 224 element changed status to: CHECKED
10.08.2022 18:34:41 The 225 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 226 element changed status to: CHECKED
10.08.2022 18:34:41 The 227 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 229 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 268 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 313 element changed status to: DISABLED
10.08.2022 18:34:41 The 314 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 100 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 101 element changed status to: CHECKED
10.08.2022 18:34:41 The 102 element changed status to: CHECKED
10.08.2022 18:34:41 The 103 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 700 element changed status to: CHECKED
10.08.2022 18:34:41 The 701 element changed status to: CHECKED
10.08.2022 18:34:41 The 104 element changed status to: CHECKED
10.08.2022 18:34:41 The 105 element changed status to: CHECKED
10.08.2022 18:34:41 The 702 element changed status to: CHECKED
10.08.2022 18:34:41 The 106 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 107 element changed status to: CHECKED
10.08.2022 18:34:41 The 108 element changed status to: CHECKED
10.08.2022 18:34:41 The 109 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 110 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 111 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 112 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 113 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 114 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 115 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 116 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 117 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 118 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 119 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 120 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 121 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 122 element changed status to: CHECKED
10.08.2022 18:34:41 The 123 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 124 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 125 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 126 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 127 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 800 element changed status to: CHECKED
10.08.2022 18:34:41 The 801 element changed status to: CHECKED
10.08.2022 18:34:41 The 914 element changed status to: CHECKED
10.08.2022 18:34:41 The 502 element changed status to: DISABLED
10.08.2022 18:34:41 The 230 element changed status to: DISABLED
10.08.2022 18:34:41 The 241 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 242 element changed status to: CHECKED
10.08.2022 18:34:41 The 243 element changed status to: CHECKED
10.08.2022 18:34:41 The 244 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 245 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 246 element changed status to: CHECKED
10.08.2022 18:34:41 The 247 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 248 element changed status to: CHECKED
10.08.2022 18:34:41 The 249 element changed status to: CHECKED
10.08.2022 18:34:41 The 250 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 251 element changed status to: CHECKED
10.08.2022 18:34:41 The 253 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 254 element changed status to: CHECKED
10.08.2022 18:34:41 The 255 element changed status to: CHECKED
10.08.2022 18:34:41 The 256 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 257 element changed status to: CHECKED
10.08.2022 18:34:41 The 258 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 259 element changed status to: CHECKED
10.08.2022 18:34:41 The 260 element changed status to: CHECKED
10.08.2022 18:34:41 The 261 element changed status to: CHECKED
10.08.2022 18:34:41 The 262 element changed status to: CHECKED
10.08.2022 18:34:41 The 262 element changed status to: DISABLED
10.08.2022 18:34:41 The 264 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 265 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 915 element changed status to: CHECKED
10.08.2022 18:34:41 The 917 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 918 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 919 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 500 element changed status to: CHECKED
10.08.2022 18:34:41 The 601 element changed status to: DISABLED
10.08.2022 18:34:41 The 501 element changed status to: DISABLED
10.08.2022 18:34:41 The 503 element changed status to: CHECKED
10.08.2022 18:34:41 The 504 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 602 element changed status to: CHECKED
10.08.2022 18:34:41 The 315 element changed status to: CHECKED
10.08.2022 18:34:41 The 316 element changed status to: CHECKED
10.08.2022 18:34:41 The 317 element changed status to: CHECKED
10.08.2022 18:34:41 The 318 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 319 element changed status to: CHECKED
10.08.2022 18:34:41 The 803 element changed status to: CHECKED
10.08.2022 18:34:41 The 320 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 321 element changed status to: CHECKED
10.08.2022 18:34:41 The 322 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 323 element changed status to: CHECKED
10.08.2022 18:34:41 The 324 element changed status to: CHECKED
10.08.2022 18:34:41 The 325 element changed status to: CHECKED
10.08.2022 18:34:41 The 326 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 327 element changed status to: CHECKED
10.08.2022 18:34:41 The 328 element changed status to: CHECKED
10.08.2022 18:34:41 The 329 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 330 element changed status to: CHECKED
10.08.2022 18:34:41 The 331 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 332 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 333 element changed status to: CHECKED
10.08.2022 18:34:41 The 334 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 335 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 336 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 337 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 338 element changed status to: CHECKED
10.08.2022 18:34:41 The 339 element changed status to: CHECKED
10.08.2022 18:34:41 The 340 element changed status to: CHECKED
10.08.2022 18:34:41 The 341 element changed status to: CHECKED
10.08.2022 18:34:41 The 342 element changed status to: CHECKED
10.08.2022 18:34:41 The 804 element changed status to: CHECKED
10.08.2022 18:34:41 The 343 element changed status to: CHECKED
10.08.2022 18:34:41 The 344 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 347 element changed status to: CHECKED
10.08.2022 18:34:41 The 348 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 349 element changed status to: DISABLED
10.08.2022 18:34:41 The 350 element changed status to: CHECKED
10.08.2022 18:34:41 The 805 element changed status to: CHECKED
10.08.2022 18:34:41 The 806 element changed status to: CHECKED
10.08.2022 18:34:41 The 807 element changed status to: CHECKED
10.08.2022 18:34:41 The 808 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 809 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 810 element changed status to: CHECKED
10.08.2022 18:34:41 The 351 element changed status to: DISABLED
10.08.2022 18:34:41 The 352 element changed status to: UNCHECKED
10.08.2022 18:34:41 The 353 element changed status to: CHECKED
10.08.2022 18:34:42 The 920 element changed status to: CHECKED
10.08.2022 18:34:42 The 923 element changed status to: UNCHECKED
10.08.2022 18:34:42 The 924 element changed status to: CHECKED
10.08.2022 18:34:42 The 925 element changed status to: UNCHECKED
10.08.2022 18:34:42 The 926 element changed status to: CHECKED
10.08.2022 18:34:42 The 927 element changed status to: UNCHECKED
10.08.2022 18:34:42 The 928 element changed status to: UNCHECKED
10.08.2022 18:34:42 The 811 element changed status to: UNCHECKED
10.08.2022 18:34:42 The 812 element changed status to: CHECKED
10.08.2022 18:34:42 The 813 element changed status to: UNCHECKED
10.08.2022 18:34:42 The 814 element changed status to: CHECKED
10.08.2022 18:34:43 The 354 element changed status to: DISABLED
10.08.2022 18:34:43 The 355 element changed status to: UNCHECKED
10.08.2022 18:34:43 The 356 element changed status to: CHECKED
10.08.2022 18:34:44 The 357 element changed status to: DISABLED
10.08.2022 18:34:44 The 358 element changed status to: UNCHECKED
10.08.2022 18:34:44 It took 3 second(s) to initialize elements
10.08.2022 18:34:44 Initialization of the UWP elements started
10.08.2022 18:34:44 It took 1 second(s) to initialize the UWP elements
10.08.2022 18:34:44 Active view is: Privacy

Без создания логов человеческих ресурсов не хватало для вычленения багов. А после добавления логирования можно было просто сказать: «Пришлите лог работы программы», — и идти спокойно спать (нет лога — нет фикса), предвкушая завтрашний дебаг. С логом жить стало лучше, жить стало веселее!

Нельзя обойти стороной и PVS-Studio, который помогает мне найти ошибки в логике работы. Да, их было немного (ведь и проект в сухих цифрах не самый большой), но то ли я стал писать со временем лучше, то ли что-то еще повлияло. Первый раз, когда я натравил PVS-Studio на проект, она нашла в сумме около 30 предупреждений, которые и были исправлены. Многие из этих предупреждений были совсем не очевидны для меня.

После того, как основные функции приложения были готовы и более-менее заработали, оказалось, что найти даже в одной категории нужный твик не так просто, если их много. Захотелось функции поиска. :) Были идеи сделать файлы индекса для каждой локализации и искать в них, динамически подгружая, но пока мы ограничились обычным перебором названий и описаний элементов, использовав функцию Contains.

private async void SearchClickedAsync(object arg)
{
    await Task.Run(() =>
    {
        var stopwatch = Stopwatch.StartNew();
        var searchString = arg as string;
        FoundTextedElement.Clear();
        Search = SearchState.Running;
        SetVisibleViewTag(Tags.ViewSearch);
        FoundTextedElement = TextedElements.Where(element => element.Status != ElementStatus.DISABLED
		&& element.ContainsText(searchString))
		.ToList();
        Search = SearchState.Stopped;
        stopwatch.Stop();
        DebugHelper.StopSearch(searchString, stopwatch.Elapsed.TotalSeconds, foundTextedElement.Count);
    });
}

С ростом функционала я стал понимать, что очень много действий строится на одной парадигме. Потому было решено написать парочку так называемых хелперов по автоматизации однотипных действий. Так появилась папка Helpers, да и не особо уже парочка хелперов там. Они записывают данные, начиная от реестра и заканчивая проверкой на здоровье Microsoft Defender.

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

В облаке хранится JSON-файл, который и парсится. Есть две ветки: стабильная и бета-версия. При компиляции через GitHub Actions считывается тип релиза (release или pre-release) и через скрипт в файл AppHelper.cs записывается свойство билда «private const bool IS_RELEASE» $true или $false. В зависимости от этого при запуске программа читает то или иное свойство файла в облаке, чтобы определить наличие новой версии.

internal class NewVersionCondition : IStartupCondition
    {
        public bool HasProblem { get; set; }
        public ConditionsTag Tag { get; set; } = ConditionsTag.NewVersion;

        public bool Invoke()
        {
            DebugHelper.IsOnline();

            try
            {
                if (HttpHelper.IsOnline)
                {
                    HttpWebRequest request = WebRequest.CreateHttp(AppHelper.SophiAppVersionsJson);
                    request.UserAgent = AppHelper.UserAgent;
                    var response = request.GetResponse();

                    using (Stream dataStream = response.GetResponseStream())
                    {
                        StreamReader reader = new StreamReader(dataStream);
                        var serverResponse = reader.ReadToEnd();
                        var release = JsonConvert.DeserializeObject<ReleaseDto>(serverResponse);
                        DebugHelper.HasUpdateRelease(release);
                        var releasedVersion = new Version(AppHelper.IsRelease ? release.SophiApp_release : release.SophiApp_pre_release);
                        var hasNewVersion = releasedVersion > AppHelper.Version;

                        if (hasNewVersion)
                        {
                            DebugHelper.IsNewRelease();
                            ToastHelper.ShowUpdateToast(currentVersion: $"{AppHelper.Version}", newVersion: $"{releasedVersion}");
                        }
                        else
                        {
                            DebugHelper.UpdateNotNecessary();
                        }

                        return HasProblem = hasNewVersion;
                    }
                }

                return HasProblem;
            }
            catch (WebException e)
            {
                DebugHelper.HasException("An error occurred while checking for an update", e);
                return HasProblem;
            }
            catch (Exception e)
            {
                throw new Exception(e.Message.Replace(":", null));
            }
        }
    }

А при нахождении всплывет вот такой милый тост с уведомлением:

SophiApp поддерживает динамически-генерируемый список установленных UWP-приложений, подгружая их локализованные имена и беря соответствующую иконку приложения, — ничего не захардкожено. Такое умеют лишь SophiApp и O&O AppBuster от O&O Software. Но эту функцию надо будет тоже как-нибудь переписать, так как она далеко не быстро работает.

В интерфейсе есть тумблер для переключения, в какой области удалять пакеты: в области пользователя или для всей ОС. Тогда все новые создаваемые пользователи не получат удаленные пакеты.

Hidden text

using SophiApp.Dto;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Management.Automation;
using System.Threading;
using Windows.ApplicationModel;
using Windows.Foundation;
using Windows.Management.Deployment;

namespace SophiApp.Helpers
{
    internal class UwpHelper
    {
        internal static Package GetPackage(string packageName)
        {
            var sid = OsHelper.GetCurrentUserSid().Value;
            var packageManager = new PackageManager();
            return packageManager.FindPackagesForUser(sid)
                                 .First(package => package.Id.Name.Equals(packageName));
        }

        internal static IEnumerable<UwpElementDto> GetPackagesDto(bool forAllUsers = false)
        {
            var currentUserScript = @"# The following UWP apps will be excluded from the display
$ExcludedAppxPackages = @(
# Microsoft Desktop App Installer
'Microsoft.DesktopAppInstaller',

# Store Experience Host
'Microsoft.StorePurchaseApp',

# Notepad
'Microsoft.WindowsNotepad',

# Microsoft Store
'Microsoft.WindowsStore',

# Windows Terminal
'Microsoft.WindowsTerminal',
'Microsoft.WindowsTerminalPreview',

# Web Media Extensions
'Microsoft.WebMediaExtensions'
)

$AppxPackages = Get-AppxPackage -PackageTypeFilter Bundle | Where-Object -FilterScript {$_.Name -notin $ExcludedAppxPackages}

# The Bundle packages contains no Microsoft Teams
if (Get-AppxPackage -Name MicrosoftTeams -AllUsers:$false)
{
	# Temporarily hack: due to the fact that there are actually two Microsoft Teams packages, we need to choose the first one to display
	$AppxPackages += Get-AppxPackage -Name MicrosoftTeams -AllUsers:$false | Select-Object -Index 0
}

# The Bundle packages contains no Spotify
if (Get-AppxPackage -Name SpotifyAB.SpotifyMusic -AllUsers:$false)
{
	# Temporarily hack: due to the fact that there are actually two Microsoft Teams packages, we need to choose the first one to display
	$AppxPackages += Get-AppxPackage -Name SpotifyAB.SpotifyMusic -AllUsers:$false | Select-Object -Index 0
}

$PackagesIds = [Windows.Management.Deployment.PackageManager, Windows.Web, ContentType = WindowsRuntime]::new().FindPackages() | Select-Object -Property DisplayName, Logo -ExpandProperty Id | Select-Object -Property Name, DisplayName, Logo

foreach ($AppxPackage in $AppxPackages)
{
	$PackageId = $PackagesIds | Where-Object -FilterScript {$_.Name -eq $AppxPackage.Name}

	if (-not $PackageId)
	{
		continue
	}

	 [PSCustomObject]@{
		Name            = $AppxPackage.Name
		PackageFullName = $AppxPackage.PackageFullName
		Logo            = $PackageId.Logo
		DisplayName     = $PackageId.DisplayName
	}
}";
            var allUsersScript = @"# The following UWP apps will be excluded from the display
$ExcludedAppxPackages = @(
# Microsoft Desktop App Installer
'Microsoft.DesktopAppInstaller',

# Store Experience Host
'Microsoft.StorePurchaseApp',

# Notepad
'Microsoft.WindowsNotepad',

# Microsoft Store
'Microsoft.WindowsStore',

# Windows Terminal
'Microsoft.WindowsTerminal',
'Microsoft.WindowsTerminalPreview',

# Web Media Extensions
'Microsoft.WebMediaExtensions'
)

$AppxPackages = Get-AppxPackage -PackageTypeFilter Bundle -AllUsers | Where-Object -FilterScript {$_.Name -notin $ExcludedAppxPackages}

# The Bundle packages contains no Microsoft Teams
if (Get-AppxPackage -Name MicrosoftTeams -AllUsers:$true)
{
	# Temporarily hack: due to the fact that there are actually two Microsoft Teams packages, we need to choose the first one to display
	$AppxPackages += Get-AppxPackage -Name MicrosoftTeams -AllUsers:$true | Select-Object -Index 0
}

# The Bundle packages contains no Spotify
if (Get-AppxPackage -Name SpotifyAB.SpotifyMusic -AllUsers:$true)
{
	# Temporarily hack: due to the fact that there are actually two Microsoft Teams packages, we need to choose the first one to display
	$AppxPackages += Get-AppxPackage -Name SpotifyAB.SpotifyMusic -AllUsers:$true | Select-Object -Index 0
}

$PackagesIds = [Windows.Management.Deployment.PackageManager, Windows.Web, ContentType = WindowsRuntime]::new().FindPackages() | Select-Object -Property DisplayName, Logo -ExpandProperty Id | Select-Object -Property Name, DisplayName, Logo

foreach ($AppxPackage in $AppxPackages)
{
	$PackageId = $PackagesIds | Where-Object -FilterScript {$_.Name -eq $AppxPackage.Name}

	if (-not $PackageId)
	{
		continue
	}

	 [PSCustomObject]@{
		Name            = $AppxPackage.Name
		PackageFullName = $AppxPackage.PackageFullName
		Logo            = $PackageId.Logo
		DisplayName     = $PackageId.DisplayName
	}
}";

            return PowerShell.Create()
                             .AddScript(forAllUsers ? allUsersScript : currentUserScript)
                             .Invoke()
                             .Where(uwp => uwp.Properties["Logo"].Value != null)
                             .Select(uwp => new UwpElementDto()
                             {
                                 Name = uwp.Properties["Name"].Value as string,
                                 PackageFullName = uwp.Properties["PackageFullName"].Value as string,
                                 Logo = uwp.Properties["Logo"].Value.GetFirstValue<Uri>(),
                                 DisplayName = uwp.Properties["DisplayName"].Value.GetFirstValue<string>()
                             });
        }

        internal static void InstallPackage(string package)
        {
            var packageUri = new Uri(package);
            var packageManager = new PackageManager();
            var deploymentOperation = packageManager.AddPackageAsync(packageUri, null, DeploymentOptions.None);
            var opCompletedEvent = new ManualResetEvent(false);
            deploymentOperation.Completed = (depProgress, status) => { opCompletedEvent.Set(); };
            opCompletedEvent.WaitOne();
        }

        internal static bool PackageExist(string packageName)
        {
            var sid = OsHelper.GetCurrentUserSid().Value;
            var packageManager = new PackageManager();
            return packageManager.FindPackagesForUser(sid)
                                 .Where(package => package.Id.Name == packageName)
                                 .Count() > 0;
        }

        internal static void RemovePackage(string packageFullName, bool allUsers)
        {
            var stopwatch = Stopwatch.StartNew();
            var packageManager = new PackageManager();
            var deploymentOperation = packageManager.RemovePackageAsync(packageFullName, allUsers ? RemovalOptions.RemoveForAllUsers : RemovalOptions.None);
            var opCompletedEvent = new ManualResetEvent(false);
            deploymentOperation.Completed = (depProgress, status) => { opCompletedEvent.Set(); };
            opCompletedEvent.WaitOne();
            stopwatch.Stop();

            if (deploymentOperation.Status == AsyncStatus.Error)
            {
                var deploymentResult = deploymentOperation.GetResults();
                DebugHelper.UwpRemovedHasException(packageFullName, deploymentResult.ErrorText);
                return;
            }

            DebugHelper.UwpRemoved(packageFullName, stopwatch.Elapsed.TotalSeconds, deploymentOperation.Status);
        }
    }
}
private void GetUwpElements()
{
    DebugHelper.StartInitUwpApps();
    var stopwatch = Stopwatch.StartNew();
    UwpElementsCurrentUser = UwpHelper.GetPackagesDto(forAllUsers: false)
	.Select(dto => FabricHelper.CreateUwpElement(dto))
	.OrderBy(uwp => uwp.DisplayName)
	.ToList();

    UwpElementsAllUsers = UwpHelper.GetPackagesDto(forAllUsers: true)
	.Select(dto => FabricHelper.CreateUwpElement(dto))
	.OrderBy(uwp => uwp.DisplayName)
	.ToList();
    stopwatch.Stop();
    DebugHelper.StopInitUwpApps(stopwatch.Elapsed.TotalSeconds);
}

При генерации списка, чтобы случайно не сломать Windows, кроме системных пакетов, в исключение попадают следующие пакеты:

Microsoft.DesktopAppInstaller,
Microsoft.StorePurchaseApp,
Microsoft.WindowsNotepad,
Microsoft.WindowsStore,
Microsoft.WindowsTerminal,
Microsoft.WindowsTerminalPreview,
Microsoft.WebMediaExtensions,
Microsoft.AV1VideoExtension,
Microsoft.HEVCVideoExtension

У каждого элемента в приложении есть состояние: включен или выключен. При запуске все элементы проверяют свое состояние и отрисовывают его в UI, показывая реальное состояние каждой функции в Windows. Да, для этого пришлось написать и отладить 130 функций для проверки состояния каждого элемента. И это не всегда быстро, так как WMI еще живее всех живых.

После применения какой-либо функции идет повторное считывание всех функций (и проставление галочек с радиокнопками соответственно), мягкий перезапуск переменных, панели задач, меню «Пуск» и отправка команды по обновлению Рабочего стола (F5). Кто в комментариях напишет, для какой функции это надо, получит зачет автоматом. :D

private const int WM_SETTINGCHANGE = 0x1a;
private const int SMTO_ABORTIFHUNG = 0x0002;
private const string TRAY_SETTINGS = "TraySettings";
private static readonly IntPtr hWnd = new IntPtr(65535);
private static readonly IntPtr HWND_BROADCAST = new IntPtr(0xffff);

// Virtual key ID of the F5 in File Explorer
private static readonly UIntPtr UIntPtr = new UIntPtr(41504);

public static void PostMessage() => PostMessageW(hWnd, Msg, UIntPtr, IntPtr.Zero);

public static void RefreshEnvironment()
{
	// Update Desktop Icons
	SHChangeNotify(0x8000000, 0x1000, IntPtr.Zero, IntPtr.Zero);
	// Update Environment Variables
	SendMessageTimeout(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, null, SMTO_ABORTIFHUNG, 100, IntPtr.Zero);
	// Update Taskbar
	SendNotifyMessage(HWND_BROADCAST, WM_SETTINGCHANGE, IntPtr.Zero, TRAY_SETTINGS);
	// Update Start Menu
	ProcessHelper.Stop(START_MENU_PROCESS);
}

Код логики элемента интерфейса:

internal class TextedElement : IElement
    {
        private string description;
        private string header;
        private ElementStatus status;

        public TextedElement((TextedElementDto Dto, Action<TextedElement, Exception> ErrorHandler,
                                EventHandler<TextedElement> StatusHandler, Func<bool> Customisation, UILanguage Language) parameters)
        {
            CustomisationStatus = parameters.Customisation;
            Descriptions = parameters.Dto.Description ?? parameters.Dto.ChildDescription;
            ErrorOccurred = parameters.ErrorHandler;
            Headers = parameters.Dto.Header ?? parameters.Dto.ChildHeader;
            Id = parameters.Dto.Id;
            Language = parameters.Language;
            StatusChanged = parameters.StatusHandler;
            Tag = parameters.Dto.Tag;
            ViewId = parameters.Dto.ViewId;
            Windows10Supported = parameters.Dto.Windows10Supported;
            Windows11Supported = parameters.Dto.Windows11Supported;
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public event EventHandler<TextedElement> StatusChanged;

        protected Dictionary<UILanguage, string> Descriptions { get; set; }

        internal Func<bool> CustomisationStatus { get; set; }

        internal Action<TextedElement, Exception> ErrorOccurred { get; set; }
        internal UILanguage Language { get; set; }
        internal bool Windows10Supported { get; private set; }
        internal bool Windows11Supported { get; private set; }

        public string Description
        {
            get => description;
            set
            {
                description = value;
                OnPropertyChanged("Description");
            }
        }

        public string Header
        {
            get => header;
            set
            {
                header = value;
                OnPropertyChanged("Header");
            }
        }

        public Dictionary<UILanguage, string> Headers { get; set; }
        public uint Id { get; }

        public ElementStatus Status
        {
            get => status;
            set
            {
                status = value;
                OnPropertyChanged("Status");
                StatusChanged?.Invoke(null, this);
            }
        }

        public string Tag { get; }
        public uint ViewId { get; }

        private void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

        internal void ChangeStatus() => Status = Status == ElementStatus.UNCHECKED ? ElementStatus.CHECKED : ElementStatus.UNCHECKED;

        internal virtual bool ContainsText(string text)
        {
            var desiredText = text.ToLower();
            return Header.ToLower().Contains(desiredText) || Description.ToLower().Contains(desiredText);
        }

        internal virtual void GetCustomisationStatus()
        {
            try
            {
                Status = CustomisationStatus.Invoke() ? ElementStatus.CHECKED : ElementStatus.UNCHECKED;
            }
            catch (Exception e)
            {
                ErrorOccurred?.Invoke(this, e);
            }
        }

        internal virtual void Initialize()
        {
            var stopwatch = Stopwatch.StartNew();
            ChangeLanguage(Language);
            GetCustomisationStatus();
            stopwatch.Stop();
            DebugHelper.TextedElementInit(Id, stopwatch.Elapsed.TotalSeconds);
        }

        public virtual void ChangeLanguage(UILanguage language)
        {
            Header = Headers[language];
            Description = Descriptions[language];
        }
    }

SophiApp умеет создавать специализированные задания в Планировщике заданий, чтобы помочь пользователю автоматизировать рутину запуска очистки диска с предзаготовленным набором флагов.

internal const string _700_CLEANUP_TASK_ARGS = @"-WindowStyle Hidden -Command Get-Process -Name cleanmgr | Stop-Process -Force
Get-Process -Name Dism | Stop-Process -Force
Get-Process -Name DismHost | Stop-Process -Force
$ProcessInfo = New-Object -TypeName System.Diagnostics.ProcessStartInfo
$ProcessInfo.FileName = """"""$env:SystemRootsystem32cleanmgr.exe""""""
$ProcessInfo.Arguments = """"""/sagerun:1337""""""
$ProcessInfo.UseShellExecute = $true
$ProcessInfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Minimized
$Process = New-Object -TypeName System.Diagnostics.Process
$Process.StartInfo = $ProcessInfo
$Process.Start() | Out-Null
Start-Sleep -Seconds 3
[int]$SourceMainWindowHandle = (Get-Process -Name cleanmgr | Where-Object -FilterScript {$_.PriorityClass -eq """"""BelowNormal""""""}).MainWindowHandle
function MinimizeWindow
{
    [CmdletBinding()]
    param
    (
        [Parameter(Mandatory = $true)]
        $Process
    )
    $ShowWindowAsync = @{
        Namespace = """"""WinAPI""""""
        Name = """"""Win32ShowWindowAsync""""""
        Language = """"""CSharp""""""
        MemberDefinition = @'
[DllImport(""""""user32.dll"""""")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow)
'@
    }

    if (-not(""""""WinAPI.Win32ShowWindowAsync"""""" -as [type]))
    {
        Add-Type @ShowWindowAsync
    }
	$MainWindowHandle = (Get-Process -Name $Process | Where-Object -FilterScript {$_.PriorityClass -eq """"""BelowNormal""""""}).MainWindowHandle
    [WinAPI.Win32ShowWindowAsync]::ShowWindowAsync($MainWindowHandle, 2)
}

while ($true)
{
    [int]$CurrentMainWindowHandle = (Get-Process -Name cleanmgr | Where-Object -FilterScript {$_.PriorityClass -eq """"""BelowNormal""""""}).MainWindowHandle
    if ($SourceMainWindowHandle -ne $CurrentMainWindowHandle)
    {
        MinimizeWindow -Process cleanmgr
        break
    }
    Start-Sleep -Milliseconds 5
}
$ProcessInfo = New-Object -TypeName System.Diagnostics.ProcessStartInfo
$ProcessInfo.FileName = """"""$env:SystemRootsystem32dism.exe""""""
$ProcessInfo.Arguments = """"""/Online /English /Cleanup-Image /StartComponentCleanup /NoRestart""""""
$ProcessInfo.UseShellExecute = $true
$ProcessInfo.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Minimized
$Process = New-Object -TypeName System.Diagnostics.Process
$Process.StartInfo = $ProcessInfo
$Process.Start() | Out-Null";

internal const string _700_CLEANUP_TOAST_TASK_ARGS = @"-WindowStyle Hidden -Command [Windows.UI.Notifications.ToastNotificationManager, Windows.UI.Notifications, ContentType = WindowsRuntime] | Out-Null
[Windows.Data.Xml.Dom.XmlDocument, Windows.Data.Xml.Dom.XmlDocument, ContentType = WindowsRuntime] | Out-Null
[xml]$ToastTemplate = @""""""
<toast duration=""""""Long"""""" scenario=""""""reminder"""""">
	<visual>
		<binding template = """"""ToastGeneric"""""" >
            <text>*</text>
			<group>
				<subgroup>
					<text hint-style=""""""title"""""" hint-wrap=""""""true"""""">*</text>
				</subgroup>
			</group>
			<group>
				<subgroup>
					<text hint-style=""""""body"""""" hint-wrap=""""""true"""""">*</text>
				</subgroup>
			</group>
		</binding>
	</visual>
	<audio src=""""""ms-winsoundevent:notification.default""""""/>
    <actions>
        <input id=""""""SnoozeTimer"""""" type=""""""selection"""""" title=""""""*"""""" defaultInput=""""""1"""""">
			<selection id=""""""1"""""" content=""""""*"""""" />
			<selection id=""""""30"""""" content=""""""*"""""" />
			<selection id=""""""240"""""" content=""""""*"""""" />
		</input>
		<action activationType=""""""system"""""" arguments=""""""snooze"""""" hint-inputId=""""""SnoozeTimer"""""" content="""""""""""" id=""""""test-snooze""""""/>
		<action arguments=""""""WindowsCleanup:"""""" content=""""""*"""""" activationType=""""""protocol""""""/>
		<action arguments=""""""dismiss"""""" content="""""""""""" activationType=""""""system""""""/>
	</actions>
</toast>
""""""@
$ToastXml = [Windows.Data.Xml.Dom.XmlDocument]::New()
$ToastXml.LoadXml($ToastTemplate.OuterXml)
$ToastMessage = [Windows.UI.Notifications.ToastNotification]::New($ToastXML)
[Windows.UI.Notifications.ToastNotificationManager]::CreateToastNotifier(""""""windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel"""""").Show($ToastMessage)";

При триггере, например, задания по очистке временных файлов пользователь увидит, как откроется специально написанное окно с предложением запустить очистку Windows, а также удалить неиспользованные обновления (замененные). В интерактивном тосте пользователь может отложить запуск на разные интервалы времени, отменить вовсе или запустить. При запуске начнет работать cleanmgr.exe, а затем dism.exe /Online /English /Cleanup-Image /StartComponentCleanup /NoRestart, что позволяет автоматизировать столь рутинное занятие. Аналогичные тосты всплывают при очистке папки временных файлов и папки %SystemRoot%SoftwareDistributionDownload с той лишь разницей, что задание для очистки последней папки будет ждать, когда остановится служба Центра обновлений Windows, чтобы случайно не удалить уже скачанные пакеты обновления, предназначенные для установки.

Всплывающие тосты

Некоторые функции рассчитаны на настоящих любителей экзотики, потому было принято решение скрыть их по умолчанию. К таким, например, относится функция по переносу папки %TEMP% официальным образом в корень диска C:.

Вишенкой креатива Дмитрия стала идея сделать несколько функций, но не показывать их в интерфейсе. Мол, это потенциально опасные для пользователя функции, и ему не нужно про них знать. На мой резонный вопрос: «Зачем?», — он парировал: «Программировай!». К счастью, WPF очень гибкий, да и я к тому времени уже не впадал в шок от его идей, хотя часто не представлял, как это сделать.

public bool AdvancedSettingsVisibility
{
	get => advancedSettingsVisibility;
	set
	{
		advancedSettingsVisibility = value;
		DebugHelper.AdvancedSettinsVisibility(value);
		OnPropertyChanged(AdvancedSettingsVisibilityPropertyName);
	}
}

private void AdvancedSettingsClicked(object args) => AdvancedSettingsVisibility = AdvancedSettingsVisibility.Invert();

В 2020 году встал вопрос об автоматизации компиляции. Легче сказать, чем сделать. В это же время GitHub аккурат выкатил свой Actions, и после множества сломанных копий при релизе триггерится Action, беря версию тэга релиза и записывает перед компиляцией в файл AssemblyInfo.cs, чтобы в заголовке программы была видна версия. Дальше идет непосредственно компиляция с выкачиванием последних версий зависимостей из своих репозиториев, архивация в ZIP-архив и автоматическая загрузка готового архива на страницу релиза. На опенсорсе, конечно, свет не сошелся, но для успокоения пользователей мы решили добавить в сборку шаг получения хэш-суммы собранного архива.

cloc творит чудеса!

cloc творит чудеса!

Также через Actions идет подсчет количества строк кода в репозитории. При пуше или пулл реквесте триггерится Action, который выкачивает cloc. Дальше через GitHub-секрет в gist Дмитрия записывается JSON-файл с данными по количеству строк кода в репозитории. В данном случае записалось «message»:»25.1k». В дальнейшем этот JSON отдается бэйджику от shields.io, который и рендерит уже красивую зеленую плашку.

Ну, и пару слов о логотипе. Перед новогодним релизом, когда было уже не так стыдно показать работающий билд SophiApp, Владимир посоветовал Наталью как фриланс-дизайнера, которая и нарисовала текущий логотип, за что ей и спасибо.

Такую разработку не дай бог каждому!

Такую разработку не дай бог каждому!

Выводы и планы на будущее

Выводы напрашиваются, собственно, сами собой:

  • Надо здраво рассчитывать свои силы, если берешься за такой проект; 

  • Четко прорабатывать техническое задание, чтобы знать объем работ;

  • Уметь терпеть и не бросать все на полпути;

  • И вообще счастье — в преодолении. :-)

Отдельное спасибо Дмитрию за то, что он прошел этот путь со мной от начала и до конца. Ну, и еще кое-что: мечтайте осторожно — мечты сбываются, ведь Дмитрий после 20 лет работы системным администратором решился сменить профессию, подавшись в разработчики. Сейчас он работает в крупной российской девелоперской компании. Если бы не мой комментарий, ничто бы в нашей жизни не изменилось.

Если вам интересны новости ИТ и технологий из первоисточников на английском, можете подписаться на мой новостной канал Sophia News, обсудить их в чате Sophia Chat, где можно задать вопросы по SophiApp, Sophia Script, ПК, ОС и прочим темам про ИТ.

Все баги и пожелания можете оставлять здесь, в Discord, в чате Telegram-группы или создайте Issue на GitHub.

Спасибо, что пережили с нами еще раз разработку SophiApp!

P.S. Спасибо за правки и редактуру текста DoubleSharp и Инне Пристягиной из PVS-Studio.

Жизнь с SophiApp

Жизнь с SophiApp

farag2 / sophia-script-for-windows
Goto Github
PK

View Code? Open in Web Editor
NEW

5.7K
138.0
527.0
110.49 MB

:zap: The most powerful PowerShell module on GitHub for fine-tuning Windows 10 & Windows 11

License: MIT License

PowerShell 100.00%
powershell
tweaks
script
windows
ltsc
debloat
debloating
sophia-script
sophia
debloater

sophia-script-for-windows’s Introduction

This page also in:

Sophia Script





Telegram
Telegram

Discord


 

 

 

 

 

 

 

 

 

 

 




Donations

System Requirements

Screenshots

Videos

Key features

How to use

How to translate

SophiApp

Changelog

About Sophia Script

Typing SVG

Note: Sophia Script for Windows is the largest PowerShell module on GitHub for Windows 10 & Windows 11 fine-tuning and automating the routine tasks. It offers more than 150 unique tweaks, and shows how Windows can be configured without making any harm to it.

Before running

Note: Due to the fact that the script includes more than 150 functions with different arguments, you must read the entire Sophia.ps1 carefully and comment out/uncomment those functions that you do/do not want to be executed (without need to edit the code), or use Wrapper. Every tweak in the preset file has its’ corresponding function to restore the default settings. Running the script is best done on a fresh install because running it on wrong tweaked system may result in errors occurring.

Donations


ko-fi
USDT (TRC20)
TQtMjdocUWbKAeg1kLtB4ApjAVHt1v8Rtf

System Requirements

Version Marketing name Build Arch Editions
Windows 11 Insider Preview 23H2 2023 Update 22509+ Home/Pro/Enterprise
Windows 11 22H2 2022 Update 22621.963+ Home/Pro/Enterprise
Windows 11 21H2 22000.1335+ Home/Pro/Enterprise
Windows 10 22H2 2022 Update 19045.2364+ x64 Home/Pro/Enterprise
Windows 10 21H2 October 2021 Update 19044.2364+ x64 Home/Pro/Enterprise
Windows 10 21H2 Enterprise LTSC 2021 October 2021 Update 19044.2364+ x64 Enterprise
Windows 10 1809 Enterprise LTSC 2019 October 2018 Update 17763.3770+ x64 Enterprise

Warning

  • It’s allowed to be logged in as one admin user only during application startup.
  • 🔥🔥🔥Sophia Script for Windows may not work on a homebrew Windows. Especially, if the homebrew image was created by OS makers being all thumbs who break Microsoft Defender and disable OS telemetry by purposely uprooting system components

Key features

  • Set up Privacy & Telemetry;
  • Enable DNS-over-HTTPS for IPv4;
  • Turn off diagnostics tracking scheduled tasks with pop-up form written in WPF;
  • Set up UI & Personalization;
  • Uninstall OneDrive «correctly»;
  • Interactive prompts;
  • The TAB completion for functions and their arguments (if using the Functions.ps1 file);
  • Change %TEMP% environment variable path to %SystemDrive%Temp;
  • Change location of the user folders programmatically (without moving user files) within interactive menu using arrows to select a drive
    • «Desktop»
    • «Documents»
    • «Downloads»
    • «Music»
    • «Pictures»
    • «Videos»
  • Install free (light and dark) «Windows 11 Cursors Concept v2» cursors from Jepri Creations on-the-fly;
  • Uninstall UWP apps displaying packages names;
    • Generate installed UWP apps list dynamically
  • Restore the default uninstalled UWP apps for current user displaying localized packages names;
  • The TAB autocompletion for function and its’ arguments by typing first letters;
  • Disable Windows features displaying friendly packages names with pop-up form written in WPF;
  • Uninstall Windows capabilities displaying friendly packages names with pop-up form written in WPF;
  • Download and install the HEVC Video Extensions from Device Manufacturer to be able to open .heic and .heif formats;
  • Register app, calculate hash, and set as default for specific extension without the «How do you want to open this» pop-up using special function;
  • Install any supported Linux distrobution for WSL displaying friendly distro names with pop-up form written in WPF;
  • Create a Windows Cleanup and Windows Cleanup Notification scheduled tasks for Windows cleaning up unused files and updates;
    • A native toast notification will be displayed where you can choose to snooze, run the cleanup task or dismiss
  • Create tasks in the Task Scheduler to clear
    • %SystemRoot%SoftwareDistributionDownload
    • %TEMP%
  • Pin shortcuts to Start via pure PowerShell
    • Three shortcuts are pre-configured to be pinned: Control Panel, «old style» Devices and Printers, and Windows PowerShell
  • Unpin all Start menu tiles;
  • Turn on Controlled folder access and add protected folders using dialog menu;
  • Add exclusion folder from Microsoft Defender Antivirus scanning using dialog menu;
  • Add exclusion file from Microsoft Defender Antivirus scanning using dialog menu;
  • Refresh desktop icons, environment variables and taskbar without restarting File Explorer;
  • Configure the Windows security;
  • Many more File Explorer and context menu «deep» tweaks.

Screenshots

The TAB autocomplete. Read more here

Image

Change user folders location programmatically using the interactive menu

Image

Localized UWP packages names

Image Image

Localized Windows features names

Image Image

Download and install any supported Linux distribution in automatic mode

Image

Native interactive toasts for the scheduled tasks

Image

@BenchTweakGaming Sophia Script Wrapper

Wrapper

Videos

YT

YT YT

How to use

  • Choose the right script version for your Windows;

  • Download up-to-date version;

  • Expand the archive;

  • Open folder with the expanded archive;

  • Look through the Sophia.ps1 file to configure functions that you want to be run;

    • Place the «#» char before function if you don’t want it to be run.
    • Remove the «#» char before function if you want it to be run.
  • On Windows 10 click File in File Explorer, hover over Open Windows PowerShell, and select Open Windows PowerShell as Administrator (how-to with screenshots)

  • On Windows 11 right-click on the Windows icon and select Windows Terminal (Admin). Then change the current location

    Set-Location -Path "PathToSophiaFolder"
  • Set execution policy to be able to run scripts only in the current PowerShell session

    Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
  • Type .Sophia.ps1 Enter to run the whole preset file.

How to use Wrapper

  • Download and expand the archive;
  • Run SophiaScriptWrapper.exe and import Sophia.ps1;
    • The Wrapper has a real time UI rendering;
  • Configure every function;
  • Open the Console Output tab and press Run PowerShell.

How to run the specific function(s)

To run the specific function(s) dot source the Functions.ps1 file first:

# With a dot at the beginning
. .Functions.ps1
  • Now you can do like this (the quotation marks required)
Sophia -Functions<kbd>TAB</kbd>
Sophia -Functions temp<kbd>TAB</kbd>
Sophia -Functions unin<kbd>TAB</kbd>
Sophia -Functions uwp<kbd>TAB</kbd>
Sophia -Functions "DiagTrackService -Disable", "DiagnosticDataLevel -Minimal", UninstallUWPApps

UninstallUWPApps, "PinToStart -UnpinAll"

Or use an old-style format without the TAB functions autocomplete (the quotation marks required)

.Sophia.ps1 -Functions CreateRestorePoint, "ScheduledTasks -Disable", "WindowsCapabilities -Uninstall"

How to download Sophia Script via PowerShell

  • Download the always latest Sophia Script archive by invoking (not as administrator too) in PowerShell
irm script.sophi.app -useb | iex
  • The command will download and expand the latest Sophia Script archive (without running) according which Windows and PowerShell versions it is run on. If you run it on, e.g., Windows 11 via PowerShell 5.1, it will download Sophia Script for Windows 11 PowerShell 5.1.

How to translate

  • Get your OS UI culture by invoking $PSUICulture in PowerShell;
  • Create a folder with the UI culture name;
  • Place your localized Sophia.psd1 file into this folder.

Media

  • Discord
  • Telegram discussion group
  • Telegram channel
  • Ru-Board
  • rutracker
  • My Digital Life
  • 4sysops
  • gHacks Technology News
  • Neowin: Tech News, Reviews & Betas
  • Comss.ru
  • Habr
  • Deskmodder.d
  • PCsoleil Informatique
  • Reddit (archived)
    • PM me

SophiApp Community Edition (C# + WPF)

SophiApp is in active development 🚀

Image
Image

sophia-script-for-windows’s People

sophia-script-for-windows’s Issues

Virtual printer is gone.

Hello, I need help. My virtual printer is gone. Can you tell me which key I modified that caused this consequence? Is there a way to revert?

I use the foxitreader’s virtual printer and it’s gone. I tried to reinstall and the option to install a virtual printer does not appear.
foxireader_novirtualprinter

I used the version published shortly after 7/15/2020
winver

http://cdn01.foxitsoftware.com/pub/foxit/manual/reader/en_us/FoxitReader9.3_Manual.pdf
Follow print and the link to the foxitreader manual and the print of my installation attempt.
foxireader_yesvirtualprinter

I am a common user and I found your work the best of all that I have seen in this context. I encourage you to continue this work for as long as you can, it really is an excellent job!

Ошибки после запуска скрипта.

Hi, during script running, I faced this errors.
C:UsersvissayDesktopWindows-10-Setup-Script-4.0.4Win10.ps1:1645 знак:31

  •     $apps = Read-Host -Prompt " "
    

Непредвиденная лексема «»
IF ($apps -match «» в выражении или операторе.
C:UsersvissayDesktopWindows-10-Setup-Script-4.0.4Win10.ps1:1646 знак:25

  •     IF ($apps -match ".exe" -and $apps -match "`"")
    

Непредвиденная лексема «» -and $apps -match «» в выражении или операторе.
C:UsersvissayDesktopWindows-10-Setup-Script-4.0.4Win10.ps1:1646 знак:46

  •     IF ($apps -match ".exe" -and $apps -match "`"")
    

Непредвиденная лексема «"") { GpuPreference $apps } elseif ([string]::IsNullOrEmpty($apps)) { break } else { IF ($RU) { Write-Host "nПути РЅРµ взяты» в выражении или операторе.
C:UsersvissayDesktopWindows-10-Setup-Script-4.0.4Win10.ps1:1687 знак:2

Отсутствует закрывающий знак «}» в блоке операторов или определении типа.
C:UsersvissayDesktopWindows-10-Setup-Script-4.0.4Win10.ps1:1685 знак:1

  • {
  • ~
    Отсутствует закрывающий знак «}» в блоке операторов или определении типа.
    C:UsersvissayDesktopWindows-10-Setup-Script-4.0.4Win10.ps1:1491 знак:1
  • {
  • ~
    Отсутствует закрывающий знак «}» в блоке операторов или определении типа.
    C:UsersvissayDesktopWindows-10-Setup-Script-4.0.4Win10.ps1:1694 знак:56
  • … IF ((Get-CimInstance –ClassName CIM_ComputerSystem).Hyperv …

Отсутствует ключевое слово while или until в цикле do.
C:UsersvissayDesktopWindows-10-Setup-Script-4.0.4Win10.ps1:747 знак:1

  • {
  • ~
    Отсутствует закрывающий знак «}» в блоке операторов или определении типа.
    C:UsersvissayDesktopWindows-10-Setup-Script-4.0.4Win10.ps1:1694 знак:56
  • … IF ((Get-CimInstance –ClassName CIM_ComputerSystem).Hypervi …

Непредвиденная лексема «)» в выражении или операторе.
C:UsersvissayDesktopWindows-10-Setup-Script-4.0.4Win10.ps1:1694 знак:85

  • … nstance –ClassName CIM_ComputerSystem).HypervisorPresent -eq $true)

Непредвиденная лексема «)» в выражении или операторе.
Выданы сообщения не обо всех ошибках синтаксического анализа. Исправьте перечисленные в сообщениях ошибки и повторите попытку.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken

Stuck at Microsoft.549981C3F5F10_8wekyb3d8bbweCortanaStartupId’ because it does not exist.

Before submitting a bug report:

  • Make sure you are able to repro it on the latest released version;
  • The .ps1 file has UTF-8 with BOM enconding.

Steps to reproduce

Download latest from release for 2004 version and execute with admin prev.

Screenshots
Capture0
Capture

Desktop (please complete the following information):
Version 2004 (OS build 19041.329)

Additional context
Add any other context about the problem here.

**Not sure about below changes: **

  • print hot key replaced with inbuilt tool and my greenshot not working. after restart — realized the new feature is awesome.
  • task bar right side icons auto expanded and there is no hidden items (its ok, but it reduces the space from middle)

Профили

Неплохо было бы разделить настройки компьютера и пользователя, чтобы настраивать отдельно.

Darkmode turns taksbar blue

Latest 2004 version turns taksbar blue in dark mode.

OneDrive not found and other errors

I did run this script three times, fails with such errors.

Errors
Line Error


1607 Cannot find path ‘C:WINDOWSTemp’ because it does not exist.
1603 Cannot find path ‘C:UsersUsernameAppDataLocalTemp’ because it does not exist.
1600 Cannot find path ‘C:PerfLogs’ because it does not exist.
1062 No MSFT_Printer objects found with property ‘Name’ equal to ‘Microsoft Print to PDF’. Verify the value of the
property and retry.
1062 No MSFT_Printer objects found with property ‘Name’ equal to ‘Microsoft XPS Document Writer’. Verify the value of
the property and retry.
1062 No MSFT_Printer objects found with property ‘Name’ equal to ‘Fax’. Verify the value of the property and retry.
1036 Cannot find path ‘D:DesktopMicrosoft Edge.lnk’ because it does not exist.
990 Property NullFile does not exist at path HKEY_CLASSES_ROOT.bmpShellNew.
989 Property ItemName does not exist at path HKEY_CLASSES_ROOT.bmpShellNew.
986 Property ItemName does not exist at path HKEY_CLASSES_ROOT.rtfShellNew.
985 Property Data does not exist at path HKEY_CLASSES_ROOT.rtfShellNew.
982 Cannot find path ‘HKEY_CLASSES_ROOT.zipCompressedFolderShellNew’ because it does not exist.
913 Property Extended does not exist at path HKEY_CLASSES_ROOTexefileshellrunasuser.
890 Cannot bind parameter ‘Name’. Cannot convert value to type System.String.
799 Cannot find path ‘J:ПрограммыПрочее’ because it does not exist.
799 Cannot find path ‘D:ПрограммыПрочее’ because it does not exist.
594 Cannot find path ‘C:UsersSerikOneDrive’ because it does not exist.
593 Property OneDrive does not exist at path HKEY_CURRENT_USEREnvironment.
581 Cannot find a process with the name «OneDrive». Verify the process name and call the cmdlet again.

Revert tray icon changes

How can I rever the tray icon to its previous state? Now all of the icons are shown, which I do not like
image

I managed to bring my search bar in the toolbar back, but I could not fix tray icon.

In my opinion, this script should give an option for skipping all the UI changes!

BSOD после использования на x32

Lock screen keyboard layout gets set to english at every reboot

My default layout is Italian, but the lock screen seems to think otherwhise after running the script. I always need to change it to be able to type the correct password, it’s pretty annoying.

Backport options

Option to exclude some part of changes does not exists.
For example, right now i am trying to get back new WIn10 Start menu view and Miscrosoft solarite game (don’t ask me why :) on several wrokstations in a corporate domain.

Error due to unicode ?

Hello
I’m unable to run your script, i think is due to characters problem ?
See my attatchment
error

Windows build version: 18362.295
Thanks

дубликат строки

встречается пару раз, выхлоп один ;)

New-ItemProperty -Path HKCU:SoftwareMicrosoftWindowsCurrentVersionContentDeliveryManager -Name SubscribedContent-338388Enabled -Value 0 -Force

Windows build 1909 Microsoft Mail doesn’t login with my computer account

Making the script more user-friendly: Encapsulation and separation of concerns

Hello. 😊

This script currently packs 150+ functions; anyone willing to apply only a subset of them needs to open the script and comment out the relevant section. The problem is, this person must know enough PowerShell to be able to distinguish sections in the first place. If they miss commenting out the closing }, the result could be quite unexpected.

One of the principles of writing good code is: Use functions to avoid code repetition.

Technique 1

Currently, there are a lot of sections in the script that look like this:

if (-not (Test-Path $SomeRegistryPath))
{
	New-Item -Path $SomeRegistryPath -Force
}
New-ItemProperty -Path $Path -Name $Name -PropertyType DWord -Value $Value -Force

…or simply, this:

New-ItemProperty -Path $Path -Name $Name -PropertyType DWord -Value $Value -Force

It can be encapsulated into a function, like this:

function Set-RegistryDword {
  [CmdletBinding()]
  param (
    [String]$Path,
    [string]$Name,
    [Int64]$Value
  )

  if (-not (Test-Path $Path))
  {
    New-Item -Path $Path -Force
  }
  New-ItemProperty -Path $Path -Name $Name -PropertyType DWord -Value $Value -Force
}

You can use this function to encapsulate the data and logic separately. Here is how lines 343 through 395 would look like:

function Set-RegistryDword {
  [CmdletBinding()]
  param (
    [String]$Path,
    [string]$Name,
    [Int64]$Value
  )

  if (-not (Test-Path $Path))
  {
    New-Item -Path $Path -Force
  }
  New-ItemProperty -Path $Path -Name $Name -PropertyType DWord -Value $Value -Force
}

$SettingsToSet = @(
  # Do not suggest ways I can finish setting up my device to get the most out of Windows
  # Не предлагать способы завершения настройки устройства для максимально эффективного использования Windows
  ('HKCU:SoftwareMicrosoftWindowsCurrentVersionUserProfileEngagement','ScoobeSystemSettingEnabled',0),

  # Do not offer tailored experiences based on the diagnostic data setting
  # Не предлагать персонализированные возможности, основанные на выбранном параметре диагностических данных
  ('HKCU:SoftwareMicrosoftWindowsCurrentVersionPrivacy','TailoredExperiencesWithDiagnosticDataEnabled',0),

  # Show "This PC" on Desktop
  # Отобразить "Этот компьютер" на рабочем столе
  ('HKCU:SoftwareMicrosoftWindowsCurrentVersionExplorerHideDesktopIconsNewStartPanel','"{20D04FE0-3AEA-1069-A2D8-08002B30309D}"',0),

  # Do not use check boxes to select items
  # Не использовать флажки для выбора элементов
  ('HKCU:SoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced','AutoCheckSelect',0),

  # Show hidden files, folders, and drives
  # Показывать скрытые файлы, папки и диски
  ('HKCU:SoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced','Hidden',1),

  # Show file name extensions
  # Показывать расширения для зарегистрированных типов файлов
  ('HKCU:SoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced','HideFileExt',0),

  # Do not hide folder merge conflicts
  # Не скрывать конфликт слияния папок
  ('HKCU:SoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced','HideMergeConflicts',0),

  # Open File Explorer to: "This PC"
  # Открывать проводник для: "Этот компьютер"
  ('HKCU:SoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced','LaunchTo',1),

  # Do not show all folders in the navigation pane
  # Не отображать все папки в области навигации
  ('HKCU:SoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced','NavPaneShowAllFolders',0),

  # Do not show Cortana button on taskbar
  # Не показывать кнопку Кортаны на панели задач
  ('HKCU:SoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced','ShowCortanaButton',0),

  # Do not show sync provider notification within File Explorer
  # Не показывать уведомления поставщика синхронизации в проводнике
  ('HKCU:SoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced','ShowSyncProviderNotifications',0),

  # Do not show Task View button on taskbar
  # Не показывать кнопку Просмотра задач
  ('HKCU:SoftwareMicrosoftWindowsCurrentVersionExplorerAdvanced','ShowTaskViewButton',0)
)

if ($SettingsToSet.Count -ne 0) {
  foreach ($item in $SettingsToSet) {
    Set-RegistryDword -Path $item[0] -Name $item[1] -Value $item[2]
  }
}

Two things have happened:

  1. Commenting out the undesired settings has become much easier for the laymen, as they don’t see the technical New-ItemProperty part.
  2. Who says they have to edit the script? You can put the settings into a separate .xml file. The user simply edits that file instead of editing the script. That way, if one day, you decided to port your code to C#, Python, or Node.js, well, you can just port the logic.

There caveats though:

  1. Some parts of the script aren’t as easy to encapsulate.
  2. Some objectives can only be accomplished by setting two or more Registry values at once, or by running other commands, like dism or taskman. Here’s when Technique 2 helps.

Technique 2

It possible to break this script into two files: Win 10 2004 Main.ps1 and Win 10 2004 Logic.psm1.

Win 10 2004 Logic.psd1 would look like this:

# Set the minimal operating system diagnostic data level
# Установить минимальный уровень отправляемых диагностических сведений
function Set-OsDiagLevelFarag {
  if ((Get-WindowsEdition -Online).Edition -eq "Enterprise" -or (Get-WindowsEdition -Online).Edition -eq "Education")
  {
    # "Security"
    # "Безопасность"
    New-ItemProperty -Path HKLM:SOFTWAREMicrosoftWindowsCurrentVersionPoliciesDataCollection -Name AllowTelemetry -PropertyType DWord -Value 0 -Force
  }  
  else
  {
    # "Basic"
    # "Базовый"
    New-ItemProperty -Path HKLM:SOFTWAREMicrosoftWindowsCurrentVersionPoliciesDataCollection -Name AllowTelemetry -PropertyType DWord -Value 1 -Force
  }   
}  

# Turn off Windows Error Reporting
# Отключить отчеты об ошибках Windows
function Disable-WindowsErrorReportingFarag {
  New-ItemProperty -Path "HKCU:SoftwareMicrosoftWindowsWindows Error Reporting" -Name Disabled -PropertyType DWord -Value 1 -Force
}

# 
# ...
# ...
# ...
# 

As you can see, this sample code is just the lines 219 through 236 of the script. The only change here is the addition of function {} definition.

Now, the Win 10 2004 Main.ps1 could look like this:

Import-Module `Win 10 2004 Logic.psm1` -Scope Local # Maybe "Local" isn't appropriate. Let's check PowerShell help later.

Set-OsDiagLevelFarag 
Disable-WindowsErrorReportingFarag
# 
# ...
# ...
# ...
# 

This script just calls functions inside Win 10 2004 Logic.psm1. Disabling the functions that the user doesn’t need is a matter of commenting only one line.

But there is something even better: People can import Win 10 2004 Logic.psm1 and just run one or two of its functions.

Which technique to use? 1 or 2?

Both. Technique 1 is useful for Win 10 2004 Logic.psm1.

However, both techniques need refining. I bet that if I familiarize myself with the script, I can make better suggestions. I haven’t studied the script thoroughly, since I was introduced to it. I have a life of my own, too, you know.

Черный экран

День добрый,
После применения скрипта (без ошибок).

При перезагрузке, после ввода пароля , черный экран, мин 5-7 (при этом ПК работает и через кон+шифт+еск запускается диспетчер задач и приложения через него).
Потом появляется заставка и меню пуск.

https://ibb.co/CvqW5cg

Такая проблема на всех ПК, где применялся скрипт шт 5.
10 -1903.

Update README.md with features list?

Currently this project has a very minimalist and unclear README.md overview and furthermore the comments inside the project files are in Russian, could we arrange a better documentation in English @farag2?

Thanks.

No MS Store connection after running the script

Before submitting a bug report:

  • Make sure you are able to repro it on the latest released version;
  • The .ps1 file has UTF-8 with BOM enconding.

Steps to reproduce
As asked, in below link there are issue and resolution.

Screenshots
H0WBrOT 1

Desktop (please complete the following information):

  • Windows build: above screenshot

Additional context
problem here.

Создание функции для переноса пользовательских библиотек

Добрый день! Не могли бы вы оформить перенос библиотек в качестве функции? Просто я заметил, что там код однотипный и функция там так и просится. Плюс ко всему и код станет универсальнее и чище (IMHO). К примеру для себя я переделал так:

CODE

Function KnownFolderPath {
    Param ( [Parameter(Mandatory = $true)]
            [ValidateSet("Desktop", "Documents", "Downloads", "Music", "Pictures", "Videos")]
            [string]$KnownFolder,
            [Parameter(Mandatory = $true)]
            [string]$Path )
    $KnownFolders   = @{"Desktop"   = @("B4BFCC3A-DB2C-424C-B029-7FE99A87C641")
                        "Documents" = @("FDD39AD0-238F-46AF-ADB4-6C85480369C7", "f42ee2d3-909f-4907-8871-4c22fc0bf756")
                        "Downloads" = @("374DE290-123F-4565-9164-39C4925E467B", "7d83ee9b-2244-4e70-b1f5-5393042af1e4")
                        "Music"     = @("4BD8D571-6D19-48D3-BE97-422220080E43", "a0c69a99-21c8-4671-8703-7934162fcf1d")
                        "Pictures"  = @("33E28130-4E1E-4676-835A-98395C3BC3BB", "0ddd015d-b06c-45d5-8c4c-f59713854639")
                        "Videos"    = @("18989B1D-99B5-455B-841C-AB7C74E4DDFC", "35286a68-3c57-41a1-bbb1-0eae73d76c95")}
    $Signature  = @{Namespace        = "WinAPI"
                    Name             = "KnownFolders"
                    Language         = "CSharp"
                    MemberDefinition = @"
[DllImport("shell32.dll")]
public extern static int SHSetKnownFolderPath(ref Guid folderId, uint flags, IntPtr token, [MarshalAs(UnmanagedType.LPWStr)] string path);
"@}
    if (-not ("WinAPI.KnownFolders" -as [type])) {Add-Type @Signature}
    $KnownFolders[$KnownFolder] | %{[WinAPI.KnownFolders]::SHSetKnownFolderPath([ref]$_, 0, 0, $Path)}
    (Get-Item -Path $Path -Force ).Attributes = "ReadOnly"
}  
function Set-UserLibrary {
    param (
        [Parameter(Mandatory = $true)]
        [string]$Path,
        [Parameter(Mandatory = $true)]
        [string]$LibraryName
    )
    $LibraryFolder = "$($Path -Replace('/+', '') -Replace('\\+', '') -Replace('\*$', ''))$LibraryName"
    if ($Script:Drives.Contains($LibraryFolder.Substring(0,3).ToUpper())) {
        $Reg = Get-ItemPropertyValue -Path "HKCU:SoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders" -Name $LibraryINI.$LibraryName[0][0]
        if ($Reg -ne $LibraryFolder) {
            if (-not (Test-Path -Path $LibraryFolder)) {New-Item -Path $LibraryFolder -ItemType Directory -Force}
            KnownFolderPath -KnownFolder $LibraryName -Path $LibraryFolder
            New-ItemProperty -Path "HKCU:SoftwareMicrosoftWindowsCurrentVersionExplorerUser Shell Folders" -Name $LibraryINI.$LibraryName[0][1] -PropertyType ExpandString -Value $LibraryFolder -Force
            Set-Content -Path "$LibraryFolderdesktop.ini" -Value $LibraryINI.$LibraryName[1] -Encoding Unicode -Force
            (Get-Item -Path "$LibraryFolderdesktop.ini" -Force).Attributes = "Hidden", "System", "Archive"
            (Get-Item -Path "$LibraryFolderdesktop.ini" -Force).Refresh()
        }
    }
}  
[hashtable] $LibraryINI = @{
    "Desktop"    =  @("Desktop", "{754AC886-DF64-4CBA-86B5-F7FBF4FBCEF5}"),
                    @("", "[.ShellClassInfo]", "[email protected]%SystemRoot%system32shell32.dll,-21769",
                    "IconResource=%SystemRoot%system32imageres.dll,-183")
    "Documents"  =  @("Personal", "{F42EE2D3-909F-4907-8871-4C22FC0BF756}"),
                    @("", "[.ShellClassInfo]", "[email protected]%SystemRoot%system32shell32.dll,-21770",
                    "IconResource=%SystemRoot%system32imageres.dll,-112",
                    "IconFile=%SystemRoot%system32shell32.dll", "IconIndex=-235")
    "Downloads"  =  @("{374DE290-123F-4565-9164-39C4925E467B}", "{7D83EE9B-2244-4E70-B1F5-5393042AF1E4}"),
                    @("", "[.ShellClassInfo]","[email protected]%SystemRoot%system32shell32.dll,-21798",
                    "IconResource=%SystemRoot%system32imageres.dll,-184")
    "Music"      =  @("My Music", "{A0C69A99-21C8-4671-8703-7934162FCF1D}"),
                    @("", "[.ShellClassInfo]","[email protected]%SystemRoot%system32shell32.dll,-21790",
                    "[email protected]%SystemRoot%system32shell32.dll,-12689",
                    "IconResource=%SystemRoot%system32imageres.dll,-108",
                    "IconFile=%SystemRoot%system32shell32.dll", "IconIndex=-237")
    "Pictures"   =  @("My Pictures", "{0DDD015D-B06C-45D5-8C4C-F59713854639}"),
                    @("", "[.ShellClassInfo]", "[email protected]%SystemRoot%system32shell32.dll,-21779",
                    "[email protected]%SystemRoot%system32shell32.dll,-12688",
                    "IconResource=%SystemRoot%system32imageres.dll,-113",
                    "IconFile=%SystemRoot%system32shell32.dll", "IconIndex=-236")
    "Videos"     =  @("My Video", "{35286A68-3C57-41A1-BBB1-0EAE73D76C95}"),
                    @("", "[.ShellClassInfo]", "[email protected]%SystemRoot%system32shell32.dll,-21791",
                    "[email protected]%SystemRoot%system32shell32.dll,-12690",
                    "IconResource=%SystemRoot%system32imageres.dll,-189",
                    "IconFile=%SystemRoot%system32shell32.dll", "IconIndex=-238")
}  
$Drives = (Get-Disk | Where-Object -FilterScript {$_.BusType -ne "USB"} | Get-Partition | Get-Volume).DriveLetter | Sort-Object -Unique | ?{$_.Length -gt 0 } | %{"$($_):"}
Write-Host "Ваши диски: " -NoNewline
Write-Host "$($Drives -join ', ')" -ForegroundColor Yellow
Write-Host "`nВведите путь, по которому будут перенесены такие библиотеки пользователя, как:" -NoNewline
Write-Host "`n`"Рабочий стол`", `"Документы`", `"Загрузки`", `"Музыка`", `"Изображения`", `"Видео`"." -ForegroundColor Yellow
Write-Host "`nЧтобы пропустить, нажмите Enter."
$LibraryPath = Read-Host -Prompt "Введите путь"
if ($LibraryPath) {
    $LibraryINI.Keys | %{Set-UserLibrary -Path $LibraryPath -LibraryName $_}
    $edge = (Get-AppxPackage "Microsoft.MicrosoftEdge").PackageFamilyName
    New-ItemProperty -Path "HKCU:SoftwareClassesLocal SettingsSoftwareMicrosoftWindowsCurrentVersionAppContainerStorage$edgeMicrosoftEdgeMain" -Name "Default Download Directory" -PropertyType String -Value "$LibraryPathDownloads" -Force
}

Kaspersky

  • Win.10.2004.4.5.4

when starting the script , Kaspersky sees it as a virus and remove it .

Автоматическое создание точки восстановления в начале работы

Имеет смысл, вдруг что-то пойдёт не так.

Не работает ночной режим(night light) после отключения «CDPSvc»

После отключения «CDPSvc«(строка 18) перестает запускаться стандартный ночной режим(night light)

Edition: Windows 10 Pro N
Version: 1903
OS build: 18362.295

Чтобы включить:

Get-Service -Name "CDPSvc" | Set-Service -StartupType Automatic
Get-Service -Name "CDPSvc" | Start-Service

Changed Default Keyboard Layout in Login Screen

I installed Windows 2004 with german keyboard layout and german language settings.
After running the script with default settings, I had english default keyboard layout in the login screen.

I was able to change it back to german layout, but maybe thats a bug other users could also struggle with.

Desktop (please complete the following information):

  • Windows build: 2004

Microsoft Edge not removed

ran this script and for the most part, it got rid of all items as described. But left Msft Edge both in the SystemApps folder and in the Start Menu. Please help! Thanks.

Edit: on the 2004 version.

Какая команда отвечает за отключение Show most used apps в меню Start?

Script Error while creating ProcessCreation.xml

The Script is showing an error (Line 3165 Could not find a part of the path ‘C:ProgramDataEvent ViewerViewsProcessCreation.xml) on Fresh Windows 10 Pro 2004 install i think the script is trying to create a file in a folder which doesn’t exist.

WSL Distro gone after running the script

Sorry for posting this. This is a request for help. I did run the Win.10.2004.4.5.6 script following the Youtube video from Chris Titus. Unlike in the video I chose to create a restore point at the start of the script.

After the script was done. I can’t find my Ubuntu 18.04 distro anymore. I recovered to the restore point, but wsl still says there are no distros installed. Unfortunately, I created a pretty big repository that I didn’t push to Github. (I know this was stupid! I don’t know why I don’t created this project.) Do you know if I can undo the distro deletion?

Desktop (please complete the following information):

  • Windows build: 19042.423

Can only add one Controlled access folder

Similar to existing bug report where can only add one high-perf app, you can only add one Controlled folder access.

options menu for UI changes

If we could have an options menu similar to the uninstall list, we could customize the UI changes easier.

image

Related #28

Send to gone after running the script

Steps to reproduce

Just run the latest version of the script (Win.10.1903-1909.4.4.6)

Desktop:

  • Windows build: 18363

Additional context
The send to option from the context menu is gone. I have had the same exact result after running the script on two different devices after a fresh windows install.

I fixed that on both devices by editing a registry entry which had an extra hyphen in its value for some reason.

Bad user input behavior

User entered text often doesn’t produce the results stated in the prompt. This is at least as bad with current version as from the version 1 week ago.

At 2 or 3 points during script execution the program just stops progressing and no prompt is given. Hitting the space bar nudges the script to continue.

At several points during script execution the prompt will not accept ENTER key until I enter some other key first. Sometimes hitting ENTER multiple times works, but I fear doing that because I don’t know if it buffers up the multiple ENTERs to use the for subsequent prompts.

Sometimes prompts won’t take any input at all until I refocus on the window (though I did nothing to take focus away from the script execution window).

Sometimes when I re-run it to see if disabled apps have reverted (which happened many times), if I see all of the apps are removed and nothing to do so just close the app-sel UI, the script freezes and there’s nothing I can do but close the script window.

Add Windows calculator to the list of excluded applications and add functionality delete user folders from this computer

Hello! It would be nice to leave the calculator out of UWP apps. And delete user folders from this computer because they are duplicated in quick access.

These folders
I mean these folders.

You could just explain how to do it so I can add it to the fork. You don’t have to add this to a new release.

So I have the code that can hide these folders. But that code for Windows register.

Code

Windows Registry Editor Version 5.00
;Удаление 7 папок пользователя из окна компьютер
[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerFolderDescriptions{0ddd015d-b06c-45d5-8c4c-f59713854639}PropertyBag]
"ThisPCPolicy"="Hide"

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerFolderDescriptions{35286a68-3c57-41a1-bbb1-0eae73d76c95}PropertyBag]
"ThisPCPolicy"="Hide"

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerFolderDescriptions{7d83ee9b-2244-4e70-b1f5-5393042af1e4}PropertyBag]
"ThisPCPolicy"="Hide"

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerFolderDescriptions{a0c69a99-21c8-4671-8703-7934162fcf1d}PropertyBag]
"ThisPCPolicy"="Hide"

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerFolderDescriptions{f42ee2d3-909f-4907-8871-4c22fc0bf756}PropertyBag]
"ThisPCPolicy"="Hide"

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerFolderDescriptions{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}PropertyBag]
"ThisPCPolicy"="Hide"

[-HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionExplorerMyComputerNameSpace{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}]

[HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionExplorerFolderDescriptions{0ddd015d-b06c-45d5-8c4c-f59713854639}PropertyBag]
"ThisPCPolicy"="Hide"

[HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionExplorerFolderDescriptions{35286a68-3c57-41a1-bbb1-0eae73d76c95}PropertyBag]
"ThisPCPolicy"="Hide"

[HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionExplorerFolderDescriptions{7d83ee9b-2244-4e70-b1f5-5393042af1e4}PropertyBag]
"ThisPCPolicy"="Hide"

[HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionExplorerFolderDescriptions{a0c69a99-21c8-4671-8703-7934162fcf1d}PropertyBag]
"ThisPCPolicy"="Hide"

[HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionExplorerFolderDescriptions{f42ee2d3-909f-4907-8871-4c22fc0bf756}PropertyBag]
"ThisPCPolicy"="Hide"

[HKEY_LOCAL_MACHINESOFTWAREWow6432NodeMicrosoftWindowsCurrentVersionExplorerFolderDescriptions{B4BFCC3A-DB2C-424C-B029-7FE99A87C641}PropertyBag]
"ThisPCPolicy"="Hide"

[-HKEY_LOCAL_MACHINESOFTWAREWOW6432NodeMicrosoftWindowsCurrentVersionExplorerMyComputerNameSpace{0DB7E03F-FC29-4DC6-9020-FF41B59E513A}]

Thanks in advance.

Strange things…

I used your script and strange things are happening here.

  1. Windows Wallet on startup — why? x1
    image

  2. Seconds on timer — why? x2
    image

  3. Windows sandbox install — why? x3
    image

  4. ribbon view on default — why? x4
    image

  5. Powershell folder in documents — okey let’s skip

image

it’s only a few minutes after the reboot, so there could be more. 🙉

Script version:

image

OS informations:

image

Help about updating

Hey dude sorry, i can’t find where to contact you
I just have a question, should i be updating the script on my PC as you have new releases?

Thanks

Can only add one App to High Graphics Performance

After adding the first one and getting back to the script, pressing ‘A’ again does nothing, it just takes you to the next part of the script.

PS script failure due to Bitdefender false positive detection for «C:WindowsSystem32TasksSetup ScriptWindows Cleanup»

My antivirus software (Bitdefender Total Security) gives me a false positive during execution of the Powershell script:

«The file C:WindowsSystem32TasksSetup ScriptWindows Cleanup is infected with Heur.BZC.WBO.Boxter.501.4B1E4D92. The threat was successfully blocked, your device is safe.»

After the Windows task has been aborted, the file «C:WindowsSystem32TasksSetup ScriptWindows Cleanup» is no longer present (not even quarantined).
Is it possible to save the generated task file otherwise, so that I can request a whitelisting by Bitdefender Support?

Windows Subsystem for Linux (WSL2) issues

After running the script, WSL2 running Ubuntu 20.04, doesn’t seem to be connected to the internet.

Steps to reproduce:

  • Clean Windows Installation (Version 2004, OS Build: 19041.330)
  • Install WSL2 (Enable Windows Features: Windows Subsystem for Linux, Virtual Machine Platform)
  • Install a Distro (Ubuntu 20.04 LTS)
  • Run $ sudo apt-get update
  • Run $ sudo apt-get install build-essential checkinstall
  • Everything should work according to plan

(Issue starting here)

  • Run the latest script
  • Reboot PC.
  • Run $ sudo apt-get update
  • Run $ sudo apt-get install build-essential checkinstall
  • This time, you get the errors attached below.

image
(Figure 1: Running $ sudo apt-get update )

image
(Figure 2: VScode complaining about the same, bottom right corner )

image
(Figure 3: Running $ sudo apt-get install build-essential checkinstall )

Taskmgr

Когда скрипт доходит до следующего кода, который запускает диспетчер задач, падает ошибка
photo_2019-12-24_14-51-14

Но как только я открываю диспетчер задач с помощью ctrl+shift+esc, скрипт продолжает работу.

Error during script’s work + feature request

Here is screenshots with several errors, maybe some of them are OK (especially warning about network connection — virtual machine does not have it, I just installed Windows 10 Pro 1909).
And what i should choose at screenshot №4?
Windows 10.zip

Feature request — make changing Desktop, Documents and other userfolders optional and skippable — I usually doint it by myself, and solution in script not understandable for me at all — Why script moving them to root of harddrive (not folder choosed by user), why user should move his files by own, what happens with current files — I don’t see Users folder in C Drive?

(Solved) SnippingTool (20H2)

I ran the test version of of this tool (20H2). It worked great except for one thing. SnippingTool has now taken control of the PrintScreen key. I have used this key with Greenshot. I selected SnippingTool and note tools (not OneNote) to be uninstalled.
I ran the script again. But I still got the same apps for uninstallation. Second time I selected all users. Din’t help.

I have tried to disable SnippingTool with both reg. entry and policy entry. It still captures the Print Screen key.

Any suggestions?

Keep up the good work! 👍🏻

Вопрос по замене $OFS

Добрый день!
Я новичок в powershell и пытаюсь использовать ваш скрипт в своих целях. У меня вопрос есть вопрос по одному из действий в скрипте. Несколько раз перед выполнением некоторых операций разделитель массива строки $OFS меняется с пробела на символ «|», а после выполнения операции меняется обратно на пробел. В частности в той части скрипта на удаление UWP-приложений. Подскажите, пожалуйста, с какой целью это делается? Ведь без этой замены UWP-приложения также удаляются.

Ps4 remote play breaks even after restoring to a previous point

I ran into this issue first when I used the debloater for 1909, but I didn’t create a restore point.
Reïnstalling ps4 remote play also didn’t work, I couldn’t even reïnstall it at first because I had to re-enable media pack features and install and setup windows media player. But after doing that and reïnstalling ps4 remote play I get the error «cannot connect to server».

I updated to windows 2004 and It started working again. Ran the debloater and made sure media pack wasn’t disabled and made a restore point. After the debloater ran the same problem occurs «can’t connect to server».
So I decided to return to the restore point so I could pin down what service or process was the problem, but I still get the error after restoring.

Right now I can’t get the ps4 remote play programm to open. It gets stuck on the error.
ps4RmtPlatPNG

Making the script more user-friendly: Those cryptic app names

Hello. 😊

Please take a look at this screenshot:
Image

  • Does an ordinary user know what Microsoft.549981C3F5F10 is? What about you? (It’s Cortana, by the way.)
  • How about c5e2524a-ea46-4f67-841f-6a9465d9d515? (It is File Explorer.)
  • Or Microsoft.MSPaint. (It is NOT Microsoft Paint. It is Paint 3D.)

I recommend the user should know the friendly name of these apps.

You can find a script called Inventory AppX Packages.ps1 on my repo. It helps you discover the friendly names.

Script only runs on 64bit system

image

I recently installed 32-bit version Windows 10 2004 when I ran your script it gave me an error that the system isn’t supported.

Error after run (win10 x64 insider)

PS Z:> .win10.ps1
Z:win10.ps1:726 знак:2

Отсутствует закрывающий знак «}» в блоке операторов или определении типа.
Z:win10.ps1:724 знак:1

  • {
  • ~
    Отсутствует закрывающий знак «}» в блоке операторов или определении типа.
    Z:win10.ps1:733 знак:56
  • … IF ((Get-CimInstance –ClassName CIM_ComputerSystem).Hypervi …

Непредвиденная лексема «)» в выражении или операторе.
Z:win10.ps1:733 знак:85

  • … nstance –ClassName CIM_ComputerSystem).HypervisorPresent -eq $true)

Непредвиденная лексема «)» в выражении или операторе.
Z:win10.ps1:890 знак:2

Непредвиденная лексема «}» в выражении или операторе.
Z:win10.ps1:891 знак:1

  • }
  • ~
    Непредвиденная лексема «}» в выражении или операторе.
    Z:win10.ps1:949 знак:2

Непредвиденная лексема «}» в выражении или операторе.
Z:win10.ps1:950 знак:1

  • }
  • ~
    Непредвиденная лексема «}» в выражении или операторе.
    Z:win10.ps1:1347 знак:77
  • … = «Р¤Р°Р№Р»С‹ реестра (.reg)|.reg|Р’СЃРµ файлы (.)|* …

Непредвиденная лексема «Р°Р№Р»С‹» в выражении или операторе.
Z:win10.ps1:1816 знак:193

  • … /c DISM /Online /Add-Package /PackagePath:"%1» /NoRestart & pause» …

Амперсанд (&) не разрешен. Оператор & зарезервирован для будущих версий. Добавьте двойные кавычки до и после амперсанда («&»), чтобы передать его как строку.
Выданы сообщения не обо всех ошибках синтаксического анализа. Исправьте перечисленные в сообщениях ошибки и повторите попытку.
+ CategoryInfo : ParserError: (:) [], ParseException
+ FullyQualifiedErrorId : MissingEndCurlyBrace

desktop ruined

So my desktop is now showing the users/Public desktop?? How can I revert this to the old desktop for MY account which is location in users/callu/OneDrive/Desktop

Скрипт для 1809 не запускается

Получаю вот такую ругань:

111

Версия последняя из master.

Скрипт не запускается

В связи с тем, что скрипт не подписан сертификатом, он просто не отработает. Более того — из батника пришлось убирать -remotesigned.
Если предполагается отключение политик или выполнять другие действия для работы, то следует написать об этом в Readme.

Pc freezes after a bit while watching streamingplaying game

Before submitting a bug report:

  • Make sure you are able to repro it on the latest released version;
  • The .ps1 file has UTF-8 with BOM enconding.

Steps to reproduce
After i run latest Win.10.2004.4.5.3.zip on my latest windows 10 2004 version. Everytime i watch streaming or gaming online my pc freezes and nothing can be done. Even the keyboard is stuck, the whole system is stuck and the only way is the reset button.
I’m pretty sure it’s the script because when i go to previous created restore point,computer smooth like ever before running the script.
Also another important thing: Browsing the pages and overall internet is very slowsluggish as it’s not after restore point is done.
How can i solve without using restore point since i want all the bloatwares and telemetry away?
Thanks in advance

bvVGlNa 1

Screenshots
If applicable, add screenshots to help explain your problem.
https://i.imgur.com/bvVGlNa.png

Desktop (please complete the following information):

  • Windows build: See screenshot link above

Additional context
Add any other context about the problem here.

Mail and Calendar app not working

I might have missed some part of code, but, Mail and Calendar apps are crashing within seconds after opening.
Need help to revert this feature or function.

Revert Time Format From Long To Short

bug
Time Showing In Seconds!! Can U help Me Revert it!!!

Содержание

  1. Windows 10 Setup Script сменил название и стал удобнее в использовании
  2. Как использовать Windows 10 Sophia Script
  3. Примечание
  4. Примечание
  5. Инструмент Windows 10 Sophia Script станет отдельным приложением
  6. SophiaApp будет поддерживать Windows 10, версия 2004 и новее, в том числе Windows 10, версия 21H1
  7. Ускорение работы компьютера с sophia script
  8. About
  9. Windows 10 Debloat Tool — графический интерфейс для Windows 10 Sophia Script
  10. Дружественный интерфейс для скрипта PowerShell
  11. Настройки Windows 10: часть III, или куда приводят скрипты
  12. Как всё начиналось
  13. Что поменялось в скрипте
  14. Функции касающиеся манипуляций с UWP-приложениями
  15. Интернационализация скрипта
  16. Закрепление ярлыков на начальном экране
  17. Создаваемые задания в планировщике заданий
  18. Функция ассоциации файлов
  19. Автоматизация установки бесплатного расширения для встроенного UWP-приложения Фотографии
  20. Автопродление имен функций по введённым буквам, содержащимся в названии функции или её аргумента
  21. Итоги

Windows 10 Setup Script сменил название и стал удобнее в использовании

Windows 10 Sophia Script представляет собой скрипт PowerShell, предназначенный для запуска сразу после установки свежей копии Windows 10 и поддерживающий более 270 различных настроек и функций.

Одна из основных проблем первоначальной версии Windows 10 Setup Script заключалась в том, что код и переключатели были интегрированы в один сценарий. В результате пользоваться скриптом было неудобно.

Разработчики рекомендовали проанализировать и настроить скрипт перед запуском, оставив в нем только желаемые для изменения функции. На практике сделать это было непросто, потому что пользователя нужно было идентифицировать переключатели и при этом проигнорировать окружающий код.

Обновленный скрипт Windows 10 Sophia Script содержит описания для каждой опции и фактической функции, но без кода. Вам остается поставить символ комментария перед любым пресетом, исполнять который не нужно или удалить символ, если он уже установлен. Не все функции выполняются по умолчанию, поэтому нужно просмотреть список для настройки функциональности.

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

Как использовать Windows 10 Sophia Script

Примечание

Windows 10 Sophia Script предназначен для опытных пользователей и задуман для запуска сразу после установки Windows 10. Так как скрипт вносит изменения в настройки и компоненты системы, настоятельно рекомендуется создать резервную копию системы перед запуском скрипта.

Системные требования. На данный момент скрипт Windows 10 Sophia Script поддерживает Windows 10 версий 2004 и 20H2.

1. Скачайте свежую версию скрипта с нашего сайта:

2. Распакуйте архив в локальной системе и отредактируйте файл с настройками Preset.ps1 в текстовом редакторе или редакторе, поддерживающем PowerShell.

Примечание

3. Откройте командную строку PowerShell с повышенными привилегиями в папке скрипта в меню Файл > Запустить Windows PowerShell > Запустить Windows PowerShell от имени администратора.

4. Проверьте версию вашей системы, выполнив команду:

5. Перед запуском скрипта необходимо настроить политику исключения, поскольку в противном случае Windows 10 откажется запускать скрипт. Выполните команду:

4. Затем запустите сценарий Windows 10 Sophia Script, выполнив:

5. Перезагрузите компьютера для применения изменений.

Разработчик опубликовал видео с демонстрацией работы скрипта:

А вы изменяете настройки свежих установок ОС? Какие инструменты вы используете для этой задачи?

Источник

Инструмент Windows 10 Sophia Script станет отдельным приложением

Скрипт Sophia Script предлагает широкие возможности по изменению настроек Windows 10. Для включения и отключения отдельных сценариев настройки системы пользователю предлагается просмотреть весь скрипт и выбрать нужные опции.

Новейшая версия скрипта получила графическую оболочку, которая упрощает процесс конфигурации и снижает вероятность ошибок. Все доступные твики теперь отображаются в дружественном графическом интерфейсе. Пользователям по-прежнему нужно пройтись по всем параметрам, которых насчитывается несколько сотен. Таким образом, процесс настройки может занимать приличное время.

Разработчики скрипта и графической надстройки работают над приложением Sophia App, которое сделает пользовательское взаимодействие еще более удобным.

На сервисе GitHub выпущено несколько тестовых версий приложения. На данный момент функциональность приложения ограничена, но вы уже можете ознакомиться, как все это будет выглядеть.

Основная цель разработчиков — поддержка всей функциональности Sophia Script в SophiaApp. В главном интерфейсе уже отображаются те же параметры меню, что и в оболочке, но большинство из них еще не заполнено содержимым, за исключением раздела «Конфиденциальность».

SophiaApp будет поддерживать Windows 10, версия 2004 и новее, в том числе Windows 10, версия 21H1

Скрипт поддерживает широкий спектр настроек для изменения параметров конфиденциальности, изменения пользовательского интерфейса и персонализации операционной системы. Вы можете настроить меню «Пуск», приложения, запланированные задачи и др. Названия не всех опций могут быть понятны, но при наведении на них мыши отображается подсказка с подробным описанием.

Трансформация скрипта PowerShell в полноценное приложение позволит привлечь новых пользователей, которых утомляло ручное инспектирование кода. Графическая оболочка уже упростила использование, но приложение сделает жизнь пользователей еще лучше.

Мы будем следить за развитием приложения и сообщать о новых возможностях SophiaApp после релиза стабильной версии.

Источник

Ускорение работы компьютера с sophia script

Sophia Script for Windows

Sophia

The largest PowerShell module on GitHub for Windows 10 & Windows 11 fine-tuning and automating the routine tasks 🏆

PowerShell%205.1%20&%207.1 Ready blue

Made%20with 149ce2raw

B8KGCa7

Minimum supported Windows versions

Version Build Editions Script version
21H2 22000.194 Home/Pro/Enterprise 6.0.5
Version Marketing name Build Arch Editions Script version
21H2 October 2021 Update 19044.1151 x64 Home/Pro/Enterprise 5.12.4
21H1 May 2021 Update 19043.1151 x64 Home/Pro/Enterprise 5.12.4
20H2 October 2020 Update 19042.1151 x64 Home/Pro/Enterprise 5.12.4
2004 May 2020 Update 19041.1151 x64 Home/Pro/Enterprise 5.12.4
1809 Enterprise LTSC 2019 17763 x64 Enterprise 5.2.15

The TAB autocomplete. Read more here

Autocomplete

Change user folders location programmatically using the interactive menu

gJFAEOk

Localized UWP packages names

0zj0h2S

Localized Windows features names

yl9j9Vt

Download and install any supported Linux distribution in automatic mode

j2KLZm0

Native interactive toasts for the scheduled tasks

jornXGR

9s7Noud

David’s Sophia Script Wrapper

z3F56Mj

0 0

1 1

Choose the right script version for your Windows ;

Expand the archive;

Open folder with the expanded archive;

Look through the Sophia.ps1 file to configure functions that you want to be run;

Set execution policy to be able to run scripts only in the current PowerShell session

How to use Wrapper

How to run the specific function(s)

To run the specific function(s) dot source the Functions.ps1 file first:

Or use an old-style format without the TAB functions autocomplete (the quotation marks required)

How to download Sophia Script via PowerShell

or without using aliases

Supported variations to launch the command on

SophiApp Community Edition (C# + WPF)

SophiApp is in active development 🚀

About

⚡ The most powerful PowerShell module on GitHub for Windows 10 & Windows 11 fine-tuning and tweaking

Источник

Ранее мы писали про Windows 10 Sophia Script — мощный скрипт PowerShell для применения различных параметров и функций к системе Windows 10. Этот скрипт предназначен для опытных пользователей, которые знают, как читать и редактировать скрипты PowerShell.

С выходом Windows 10 Debloat Tool GUI / Debloater (2004/20H2) доступ к тем же параметрам и функциям осуществляется из графического интерфейса, который привычен любому пользователю. Вам нужно скачать пакет приложения на сайте, извлечь архив и запустить исполняемый файл.

В архиве содержится версия Sophia Script, поэтому вы сразу же можете вносить изменения в систему. Для запуска инструмента нужны права администратора, поэтому вы получите запрос службы контроля учетных записей при запуске.

Для навигации по различным категориям используются вкладки. Все опции расположены в зеленых и красных столбцах. Цвет столбца предназначен для визуального разделения колонок и никак не связан с опасностью применения конкретных функций.

У каждого параметра имеется флажок, который нужно отметить, чтобы применить определенную функцию. Вам нужно сначала пройтись по вкладкам и отметить необходимые опции, а потом использовать опцию «Run PowerShell» на вкладке Output для применения изменений.

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

Также программа не проверяет текущие настройки, чтобы отмечать различные флажки в своем интерфейсе.

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

Выберите меню Options, чтобы сбросить все отмеченные параметры (Clear all) или восстановить значения по умолчанию (Defaults).

Дружественный интерфейс для скрипта PowerShell

Windows 10 Debloat Tool GUI / Debloater (2004/20H2) является полезной утилитой для пользователей Sophia Script. Все настройки скрипта доступны в графическом пользовательском интерфейсе, который привычен для большинства пользователей.

На данный момент приложение не лишено недостатков. На некоторых устройствах текст отображается нечетко, для параметров недоступны описания, а проверка текущих настроек не выполняется. Тем не менее, данный инструмент использовать проще, чем работать с текстовым сценарием PowerShell.

Источник

Настройки Windows 10: часть III, или куда приводят скрипты

fc25206988fd80b89ff3e367b95ae778

Здравствуйте, товарищи! Прошло чуть больше полугода после выхода предыдущей статьи о Windows 10 Sophia Script — скрипте, который за прошедшие годы стал самым крупным (а их осталось всего два) опенсорс-проектом по персонализации и настройке Windows 10, а также автоматизации рутинных задач. В статье я расскажу, что изменилось с момента релиза версии, описываемой в статье от 29.09.2020, с какими трудностями мы столкнулись, и куда всё движется.

Как всё начиналось

Разработка наброска скрипта берёт своё начало в те далёкие времена, когда после года работы экономистом в отделе проектирования птицефабрики в одной организации я решил перейти в местный отдел IT.

22634a85b31270399317cdf22eaaa094Отдел IT

Так продолжалось, наверное, год, пока я не понял, что упёрся в тупик и надо менять язык: начал готовить «батник».

В первый день выхода Windows 10 я сразу же «пересел» на неё, поняв, что Windows 8.1 осталась для Microsoft в прошлом. Со временем же «батник» рос, «мужал», разрастался и в какой-то момент даже стал дёргать другой интерпретатор, powershell.exe. Скорость работы падала, и я понимал, что придётся учить PowerShell, так как batch уже не удовлетворяет моим маниакальным запросам автоматизировать всё при настройке ОС.

Как сейчас помню, в феврале 2017 года я сел читать первую статью по запросу «как внести данные в реестр с помощью PowerShell». Уже к лету 2017 года я значительно продвинулся в переписывании всех имеющих функций из «батника» в новый скрипт.

Помню, как первый раз почувствовал, что я делаю что-то полезное, когда некто создал issue с просьбой указывать, что я исправляю, когда перезаписываю файлы на GitHub. Пришлось вести журнал изменений.

В таком неспешном темпе разработка шла до августа 2019 года, когда я решил поделиться своими наработками здесь. Хотя я читаю Хабр с года эдак 2007-го, зарегистрировался лишь в 2016-м.

Немного облагородил код (ага, 10 раз), добавил описания на английском языке и накатал крохотную статью о своей pet-разработке. Удивительно, но статью пропустили, она попала в бездну, и я сел ждать.

image loaderМой лик, когда ожидаю приглашения

Как сейчас помню: сижу на сеансе в кинотеатре, и приходит уведомление на почту о новом комментарии к моей статье. Так, стоп! Её одобрили?!

Я не успевал отвечать на комментарии! Это была какая-то эйфория. Какой там фильм?! — меня на Хабр пригласили прямым инвайтом! Фурор! Даже код не обо. ли (а там был кровавый мрак) и вообще любезно приняли.

image loaderМой лик, когда получил приглашение

Самым неожиданным поворотом стало то, что через 5 дней после публикации мне написал некий Дмитрий (@oz-zo), прочитавший моё сетование на то, что у меня не хватает знаний, чтобы сделать графическую версию скрипта, даже хотя бы на Windows.Forms. Я был приятно удивлён, что есть ещё один старый безумец. Как выяснилось, старый, но не бесполезный!

Познакомившись, мы запланировали всё сделать примерно за 3 месяца на Windows.Forms, но наше приключение затянулось… больше чем на 1,5 года: лишь в этом месяце мы вышли на финишную прямую по созданию графической версии моего скрипта — SophiApp. Но это уже другая история, и, когда будет что показать, я обязательно расскажу, что мы пережили за время разработки, поделившись нашими инфернальными набросками и наработками.

image loader image loader

С того времени как я познакомился с Дмитрием, разработка пошла быстрее: он внёс огромный вклад в создание новых функций, которых не было ни у кого: все графические функции с использованием WPF и логику к ним написал именно он; я лишь объяснил, как получать данные.

4e8e0397429bc709c4e90ce2d1f98457Иконка Sophia Script

Немаловажным событием стало также знакомство с Дэвидом из Канады, который решил сделать самостоятельно графическую надстройку для Sophia Script, Sophia Script Wrapper, для повышения удобства редактирования пресет-файла. В текущем варианте пользователь импортирует пресет-файл скрипта, и в программе расставляются радиокнопки в зависимости от закомментированных и раскомментированных функций. Дальше можно настроить под себя и запустить выполнение настроенного пресет-файла.

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

image loaderSophia 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-приложений. Чтобы восстановить пакет, как известно, необходимо вычленить путь до его манифеста.

image loaderВосстановление удаленных UWP-приложений для текущего пользователя

Код для получения общего списка всех манифестов выглядит так (можете даже выполнить, если, конечно, не удалили все UWP-приложения):

И вы увидите что-то вроде:

Но нам надо сопоставить имя пакета, его локализованное имя в системе и путь до манифеста. Искать будем среди пакетов, которые имеют статус «Staged», то есть готовы к восстановлению.

Ну, а дальше уже дело техники. Кстати, если вам надо восстановить все возможные пакеты без разбора, то в этом вам поможет.

Мы специально не хотели хардкодить список приложений как на удаление, так и на восстановление, так это слишком топорно. Одним словом, получить локализованные имена приложений реально. Дмитрий создал форму на WPF и накатал логику. Не знаю, почему, но мне с Дмитрием потребовалась, наверное, пара недель, учтя все возможные и невозможные условия использования, заставить всё работать как надо.

Точно таким же способом можно выводить список локализованных имён компонентов Windows и дополнительных компонентов.

Работает экстремально медленно, но спасает то, что у меня выводится лишь захардоженный список компонентов, которые можно безболезненно отключить (и включить опять, конечно).

74258312de2f67b76867d46c87bbef58Было 626f96cb4c08303ceb0bc78f41668dd6Стало 149377599d71acd5fec64cf4c32b9663Наши лики, когда, наконец, всё заработало

Интернационализация скрипта

На необходимость этой фичи обратил внимание @FrankSinatra в комментариях. Интернационализация позволяет избавиться от страшной конструкции вида

Соответственно, чтобы это всё заработало, мы импортируем указанные локализационные файлы, сохраняя строки в переменную так, чтобы можно было вызывать их в скрипте:

И в зависимости от текущей локализации системы скрипт сам будет искать нужный файл. И код чище, и людя́м приятнее! Ну, а если необходимой локализации нет, то по умолчанию загружается английская.

На сегодня скрипт локализован на 8 языков: английский, китайский, немецкий, французский, итальянский, русский, украинский, турецкий, испанский и португальский. В будущем всё-таки планирую разместить языковые файлы на Crowdin, но немного душит жаба платить столько денег за некоммерческий продукт.

Закрепление ярлыков на начальном экране

Используется при этом чистый PowerShell. Изначально я использовал стороннюю программу syspin, но возникло желание всё-таки избавиться от неё. Как вы знаете, с выходом Windows 10 October 2018 Microsoft без шума закрыл доступ к API открепления (закрепления) ярлыков от начального экрана и панели задач: отныне это можно сделать лишь вручную.

image loader

Ниже приведён пример кода для закрепления (открепления) ярлыка на начальный экран, который когда-то работал. Как можете видеть, в коде используется метод получения локализованной строки, и для этого нам необходимо знать код строки, чтобы вызвать соответствующий пункт контекстного меню. В данном примере, чтобы закрепить ярлык командной строки, мы вызываем строку с кодом 51201, «Закрепить на начальном экране», из библиотеки %SystemRoot%system32shell32.dll.

Получить список всех локализованных строк удобнее всего через стороннюю утилиту ResourcesExtract.

image loader

Попытка закрепить ярлык командной строки устаревшим методом:

Сейчас консоль вываливается с ошибкой Access is denied. (Exception from HRESULT: 0x80070005 (E_ACCESSDENIED).)

image loader image loader

Хотя, как можно заметить, API, конечно, отдаёт глагол контекстного меню «Закрепить на начальном &экране», но не может его выполнить.

Идея заключается в том, чтобы использовать политику «Макет начального экрана» (Prevent users from customizing their Start Screen), отвечающую за подгрузку предзаготовленного макета в формате XML из определённого места. Таким образом, наш хак будет состоять из следующих пунктов:

Выгружаем текущий макет начального экрана.

Парсим XML, добавляя необходимые нам ярлыки (ссылки должны вести на реально существующие ярлыки), и сохраняем.

С помощью политики временно выключаем возможность редактировать макет начального экрана.

Перезапускаем меню «Пуск».

Программно открываем меню «Пуск», чтобы в реестре сохранился его макет.

Выключаем политику, чтобы можно было редактировать макет начального экрана.

И открываем меню «Пуск» опять.

image loader

Вуаля! В данном примере мы настроили начальный экран на лету, закрепив на него три ярлыка для текущего пользователя: панель управления, устройства и принтеры и PowerShell, причём без перезапуска или выхода из учётной записи.

image loaderКод целиком:

Создаваемые задания в планировщике заданий

Для начала разберём две задачи по автоматизации очистки папок %TEMP% и %SystemRoot%SoftwareDistributionDownload. Эти папки полезно очищать по расписанию, чтобы они не разрастались. На текущий момент папка временных файлов самоочищается раз в 60 дней, а папка, куда скачиваются установочные файлы для обновлений, — раз в 90 дней.

По завершении задания были добавлены нативные всплывающие тосты, так сказать, из информационно-эстетических соображений.

c547fa7c60154a6405d8f637a9128e2e

Windows 10 позволяет генерировать такие тосты очень просто. Пример всплывающего тоста, как на картинке выше:

В вызове CreateToastNotifier можно указывать приложение, иконка которого будет отображаться в верхнем левом углу тоста и которое будет открываться при нажатии на тост. В данном случае я использовал windows.immersivecontrolpanel_cw5n1h2txyewy!microsoft.windows.immersivecontrolpanel — «Настройки». Но вы вольны указать любые приложения. Узнать список всех установленных приложений и их AppID нам поможет команда Get-StartApps.

Напомню, что задача по очистке папки для временных файлов удаляет лишь файлы старше суток:

А задача по очистке папки %SystemRoot%SoftwareDistributionDownload ждёт остановку службы wuauserv (Центр обновления Windows), чтобы в дальнейшем очистить папку

С заданием по запуску очистки диска и DISM с аргументами всё гораздо веселее. Изначально стояла задача просто запускать предзаготовленный пресет настроек для очистки диска и очистку ненужных обновлений, используя DISM: dism.exe /Online /English /Cleanup-Image /StartComponentCleanup /NoRestart.

Но пришлось решать, как заставить задание запускать очистку диска, сворачивать его окно, а потом также минимизировать окно консоли с запущенным DISM.

Сложность состоит в том, что при запуске очистки диска сначала открывается первое окошко со сканированием того, что можно очистить, потом оно закрывается, и только после этого открывается новое окошко (с новым MainWindowHandle) уже непосредственно с очисткой.

Если первое окошко достаточно легко свернуть:

То над тем, как свернуть второе, я поломал голову, конечно. После многих попыток хоть за что-то зацепиться, я понял, что:

только MainWindowHandle окна может помочь

Но на этом я не остановился. Понял, что, возможно, пользователю будет неудобно, что за него решают, когда запускается такая задача (которая иногда может потребовать достаточное количество времени). Поэтому пришла идея сделать интерактивный всплывающий тост!

image loader

Как видно на скриншоте, пользователю предоставляются на выбор 3 варианта развития событий: отложить вопрос на 1, 30 минут или 4 часа, полностью отклонить предложение (тогда задача запустится через 30 дней) или запустить.

Как устроено это окно. Это всё тот же тост, но, чтобы создать кнопку, запускающую что-либо, кроме открытия страницы в браузере, необходимо сначала зарегистрировать новый протокол. В примере ниже показывается, как я регистрирую протокол WindowsCleanup:

А потом привязываю его на кнопку запуска:

Всё вместе выглядит так:

Функция ассоциации файлов

Как известно, начиная с Windows 8 невозможно самостоятельно ассоциировать какое-либо расширение с программой, не вычислив правильный хэш. Как выяснилось, Microsoft проводит манипуляции с захардоженной строкой «User Choice set via Windows User Experience «.

Пользователь Danyfirex смог реализовать правильное вычисление хэш-суммы на чистом PowerShell, но, к сожалению, после проведённых тестов выяснилось, что сам PowerShell 5.1 считает его неправильно, поэтому я вынужден был использовать код другого разработчика с алгоритмом, реализованным на чистом C#. Крайне быстро! Функция огромная, поэтому просто оставлю просто ссылку на код.

Автоматизация установки бесплатного расширения для встроенного UWP-приложения Фотографии

image loader

image loader

Для скачивания установочного пакета на помощь приходит всеми известный сайт https://store.rg-adguard.net. Он позволяет, зная ID страницы, получать временные прямые ссылки на установочные пакеты. Значит, можно распарсить.

Дальше уже дело техники сохранить и установить скачанный пакет.

Автопродление имен функций по введённым буквам, содержащимся в названии функции или её аргумента

Это последняя значимая функция, добавленная в версию 5.10. Пользователи попросили добавить автопродление функций и их аргументов с помощью табуляции, вводя буквы, содержащиеся в названии функции или её аргументов.

То есть ни о каком автопродлении речи и не шло: пользователю приходилось или запоминать имя функции и её аргумент, или копировать вручную данную комбинацию из пресет-файла. То ли дело сейчас!

image loader

Чтобы заработала сия шайтан-машина, пришлось прибегнуть к Register-ArgumentCompleter.

Весь код сосредоточен в отдельном файле, и не получится его поместить в текущий пресет-файл: файл необходимо вызывать с использованием dot sourcing. Одним словом, пришлось в ScriptBlock для argumentcompleter перебирать все возможные варианты конструкций вида «функция-аргумент» и просто «функция», если у последней нет собственного аргумента.

Крайне жутко выглядит, но стало гораздо удобнее.

Ну, а закончу рассказ на том, что даже сборка прикрепляемых архивов на странице релизов стала осуществляться с помощью конфига Github Actions. Как можно заметить, для создания архива под версию для PowerShell 7 приходится выкачивать две библиотеки с ресурсов Microsoft, так как загрузить файлы больше 25 МБ в репозиторий невозможно. Автоматизируй автоматизацию!

Итоги

Это были крайне плодотворные полгода. У нас такое ощущение, что мы прошли PowerShell на уровне «Ultra Violence». Ну, а что дальше? Параллельно я прорабатываю вариант, как реализовать, используя текущий паттерн взаимодействия пользователя со скриптом, настройку офлайновых образов WIM. Но главный приоритет для нас сейчас, конечно, — разработка SophiApp.

a95f798f363cb176f0fa848c743edf97

Цель проекта — показать, как, по нашему мнению, должен выглядеть, чувствоваться и каким функционалом обладать так называемый твикер для Windows 10. Идей — просто огромное количество! Хотя у нас нет опыта в разработке и нас всего лишь двое, а весь код на SophiApp пишет в одиночку Дмитрий, возможно, летом уже появится первый рабочий билд. Но это уже совсем другая история.

Хочу выразить огромную благодарность также пользователям forum.ru-board westlife и iNNOKENTIY21: ребят, без вашей помощи и подсказок, всё было бы по-другому! А логотип нарисовала художница tea_head, за что ей тоже спасибо. Скрины, использованные в материале, взяты из мультфильма Коргот-варвар. Группа в Telegram. Любите Windows 10, настраивайте её с умом и до новых встреч!

А если хотите прокачать себя, например получить навыки пентестера и зарабатывать на уязвимостях, или подтянуть знания алгоритмов и структур данных — приходите учиться в SkillFactory, будет сложно, но интересно!

b2ac70848031ec48a4b62f40a6e315d5

Узнайте, как прокачаться и в других специальностях или освоить их с нуля:

Источник

Read the label and ToolTip message popup when you hover your mouse over the selection for more information.

Now with Windows 11 support! With this FREE software, you can easily create a PowerShell script file using a Graphical User Interface (GUI Front End) that you can run to tweak/”Debloat” Windows 10/11. You can make Windows 10/11 more lean. Tailor your Windows for gaming! Works on versions LTSC:1809(2019)/21H2(2021)/2004/(20H2/2009)/21H1/21H2/22H2 – May 2020, October 2020, May 2021, October 2021/2022 Update!


Are you looking for a easier solution? Try SophiApp! The full GUI version of Sophia Script! LINK: https://github.com/Sophia-Community/SophiApp

SophiApp – full GUI version of Sophia Script – No more PowerShell and Wrapper!

LINK to Download: https://github.com/farag2/Sophia-Script-for-Windows

SOURCES, REFERENCES & IMPORTANT NOTICES

We now work with farag2 (Dmitry Nefedov) the creator of Windows 10/11 ‘Sophia Script for Windows‘: https://github.com/farag2/Sophia-Script-for-Windows. Our tool is basically a front-end/GUI wrapper for the source scripts to make things easier to choose the many of options. Check updates to see what we have added. farag2’s GitHub now hosts our wrapper. We try to work with farag2/Dmitry to update the main script when we find anything that needs work. We are getting more involved with his projects.

NOTICE 1: During the PowerShell script run you will still encounter prompts requiring your attention. So be near your computer to input your responses.

NOTICE 2: This program only reads from JSON files. Everything is done through these files so you can modify every option.

ABOUT PROGRAM: We are beginner programmers so things look quite ‘beginner-level’. The whole idea of this Front End/GUI Wrapper was to build a ‘selection form builder’ to create selection options from reading simple JSON files so anyone could add their own options to the program themselves via adding to or removing from it. This way we don’t have to come back and hardcode new options. Therefore the program is end-user maintainable, fixable and shareable. Also, by creating a PowerShell script, it is now portable and shareable without the GUI wrapper. We are trying to improve it. Check Future Updates.

README

This program creates a PowerShell script file that you can run to tweak/’Debloat’ Windows 10/11. Please choose to create a restore point in ‘System Protection’ tab so you can safely use this tool.

NEW CHANGE: The wrapper can be launched anywhere (no more copying the wrapper files to the ‘Sophia’ script folder) but you must import the ‘Sophia.ps1’ file to import your preset and to get the path for files to run. If you do not open ‘Sophia.ps1’ then the Wrapper controls are disabled. The options are arranged in different tabs and there is a Sophia and Windows Default preset in the Presets menu so you can debloat a set of options or revert back to defaults. You can choose the Sophia preset first and then add your own choices. Create your own “Sophia.ps1” file to share and read with the wrapper. There are ToolTips balloon message popups for detailed info for each label and option. There is ‘Opposite’ selection to choose alternate choices. There is language selection for ToolTips.

HOW TO USE

Installation

Sophia Script Wrapper can be used without installation. Navigate to the GitHub “Releases” page and download the “Wrapper” zip and appropriate “Script” zip for your Windows version.

Click ‘Releases’
Download ‘Wrapper’ and download ‘Script’ zip files
Unzip ‘Script’ to Desktop for example
Unzip ‘Wrapper’ zip file (on Desktop for example) and Run ‘SophiaScriptWrapper.exe’

Usage

  • Click “Import | Export” menu item and click “Import Preset” and browse to the “Script” folder (on Desktop for example) and open “Sophia.ps1”
Click ‘Import | Export’ and then click ‘Import Preset’
Browse to the ‘Script’ folder and open it
Open ‘Sophia.ps1’
  • The Wrapper’s controls should be enabled now for you to choose your selections. Most of the controls of each tabs should be filled with the imported “Sophia.ps1” selections. “Sophia.ps1” contains the “Sophia Preset” which is recommend selections.
After (importing) opening ‘Sophia.ps1’ the Wrapper’s controls should be enabled for you to select
  • Go to the “Console Output” to see the PowerShell script created from your selections and click the “Run PowerShell” button to execute the script. The “Run PowerShell” button creates overwrites imported “YOUR.ps1” and runs it. It makes a backup of “Sophia.ps1” called “Sophia_original.ps1” if import file is called “Sophia.ps1”.
The ‘Console Output’ tab has the generated PowerShell script for you to run ‘Run PowerShell’ or save (export)

Manually Run

Save (Export) the PowerShell script generated from your selections as whatever you want with Sophia files (see heading FILES below) and run it using the following commands.

Launch PowerShell (Run as administrator) and navigate to where your script is.

  1. Set-ExecutionPolicy -ExecutionPolicy Bypass -Scope Process -Force
  2. ./YOUR_SCRIPT.ps1

YOUR_SCRIPT is the exported save file you named.

UPDATES

Future Updates / Upcoming Developments

SophiApp released (Full GUI version of Sophia Script: CLICK HERE!). We will continue to update the wrapper program to work with future Sophia scripts alongside SophiApp. Almost finished v3.0 of Wrapper using WinUI3 and C#.

Update v2.5.8

Fixed some bugs, Added Discord link

Update v2.5.7

Output PowerShell: Refresh Console before Export, Output DNSoverHTTPS for other languages other than English

Update v2.5.6

Fixed minor UI bug, Resized width of window for Russian and fixes scrolling per tab.

Update v2.5.5

Hotfixes

Update v2.5.4

Added category “Update Policies”.

Update v2.5.3

More validation for JSON added, Backup of “Sophia.ps1” to “Sophia-original.ps1” if using import ps1 file called “Sophia.ps1”, Otherwise if importing “x.ps1”, the file will be overwritten if the “Run PowerShell” button is used

Update v2.5.2

Cleaned up JSONs, Cleaned up code, Added Portuguese-Brazil (pt-BR), JSON validation checker in wrapper: messagebox will popup telling you location of JSON error, Added support for LTSC 2021

Update v2.5.1

Cleaned up code, Fixed typos in JSONs, Added Spanish (es-ES), Fixed UI

Update v2.5

More JSONs. Split up Windows 10 and Windows 11 config and tooltip JSONs files, Console Textbox is now resizable, Moved “Save As” button to ‘Export Preset’ in ‘Import/Export Preset’ menu

Update v2.4

German translation updated, Must import “Sophia.ps1” before using wrapper now – the controls are disabled to do this, UI changes (color to highlight important controls) and bug fixes.

Update v2.3

German translations, Added icons to tabs, fixed bugs, UI changes.

Update v2.2

Updated to support Windows 11 along with 10. Fixed a number of bugs. UI and ToolTip JSON files. Links to Telegram chat for support (News channel and Chat Channel).

Update v2.1

Improved UX, All settings were moved to JSON file (3,600 lines), UI changes.

Update v2.0.2

Fixed runtime error, Fixed PowerShell 7.1 launch (detects 5.1 or 7.1 and uses appropriate PowerShell to launch either), Added online check for the latest Wrapper version. If you are using old version it will exit. Added online check for the latest imported script version. If you are using old version it will disable directly running (run PowerShell button disabled), UI changes

Update v2.0.1

Added “Opposite” selection, language selection, Russian ToolTips, and fixed some bugs.

Update v2.0

Redesigned UI/UX with modern UI and optional theme changes “Dark/Light”.

FILES

NEW CHANGE: The wrapper can be launched anywhere after unzipping ZIP package (no more copying the wrapper files to the ‘Sophia’ script folder) but you must import the ‘Sophia.ps1’ file to import your preset and to get the path for files to run. If you do not open ‘Sophia.ps1’ then the Wrapper controls are disabled.

Wrapper Files

The most settings are stored in a JSON file stored in a folder “Config”. There are currently 5 languages for UI and ToolTips: English, Russian, German in separate JSON files. Please help with translations for everyone to use.

Sophia Script Wrapper.exe : The GUI program.
config_Windows_1x.json: JSON that contains the options (function names), Win10/11, Sophia preset and Windows Default preset. LTSC version.
tooltip_Windows_1x.json : ToolTips in JSON format. Currently just 5 languages EN, RU, DE, ES an PT translations.
tag.json : Tags in JSON format. Currently just 5 languages EN, RU, DE translations.
ui.json : UI in JSON format. Currently just 5 languages EN, RU, DE translations.
README.md: Documentation. Information found here in this post.

Sophia Files

Sophia.ps1 : farag2 Original Windows PowerShell Script. Make a copy of this file for backup. Open this file to import preset and to get path for files to run directly the script you create.
Sophia.psd1 : farag2 Windows PowerShell Data File.
Sophia.psm1 : farag2 Windows PowerShell Script Module.
Functions.ps1 : farag2 PowerShell Script to run functions with tab autocompletion

The folders are localized language files for prompts during the PowerShell execution each with a PowerShell Data File ‘Sophia.psd1’.

►de-DE
►en-US
►es-ES
►fr-FR
►hu-HU
►it-IT
►pt-BR
►ru-RU
►tr-TR
►uk-UA
►zh-CN

VIDEO WALKTHROUGH

Video 4: LATEST Video Walkthrough of ‘Sophia’ projects (Script, Wrapper and SophiApp)
Video 3: (Outdated) Video Walkthrough of ‘Sophia’ projects (Script, Wrapper and SophiApp)
Video 2 (Outdated): Fast Walkthrough using ‘Run PowerShell’
Video 1 (Outdated): Full Walkthrough

COMPARISON

Before
After
Click the images to see larger images. Before: Higher CPU load, 142 processes, 1.9 GB RAM used, 26 seconds to boot. After: Lower CPU load, 130 processes, 1.6 GB RAM used, 23 seconds to boot.

ALTERNATIVES

SophiApp is the full GUI version of Sophia Script. It is made in pure C# and WPF. Features all the functions of the Sophia Script in a standalone EXE. Link: https://github.com/Sophia-Community/SophiApp

SophiApp – Full GUI version of Sophia Script

We have an alternative on our second site called Windows 11 Debloater. It has an ‘EZ Debloatermenu page with buttons to quickly debloat and different options including 3rd Party installation of Adobe Reader, Java, Brave, MPCHC, VLC Player, etc., O&O ShutUp10, setting default apps associations and fine control of removing other 45+ Windows apps. Link: https://freetimetech.com/windows-11-debloater-tool-debloat-gui/

Based on Chris Titus Tech and Sophia scripts

We have an alternative on our second site called Windows 10 Debloater. It has an ‘EZ Debloatermenu page with buttons to quickly debloat and different options including 3rd Party installation of Adobe Reader, Java, Brave, MPCHC, VLC Player, etc., O&O ShutUp10, setting default apps associations and fine control of removing other 45+ Windows apps. Link: https://freetimetech.com/windows-10-clean-up-debloat-tool-by-ftt/

Based on Chris Titus Tech and Sophia scripts

We also have Optimize-Offline Front End. Optimize-Offline is a Windows Image optimization module for Windows 10. Our tool allows to easily change Optimize-Offline JSON configuration setting file using a GUI and Run O-O. Link: https://benchtweakgaming.com/2020/11/01/optimize-offline-gui-tool-front-end/

Front End for GodHand’s Optimize-Offline scripts

NOTE

WARNING! We are not responsible for any problems you may encounter using our software. Please read the instructions and watch the video carefully before using.

Понравилась статья? Поделить с друзьями:
  • Sophia script for windows 10 как пользоваться
  • Sopcast скачать бесплатно на русском языке для windows 10 торрент
  • Sony xperia программа для компьютера windows 7
  • Sony xperia z3 compact драйвер для windows 7
  • Sony wireless state device windows 10 x64