@ -21,17 +21,19 @@
. EXAMPLE
PS C: \ > & '.\Win 10.ps1'
. NOTES
Version : v4 . 3
Date : 21 . 05 . 2020
Written by : farag
Version : v4 . 4
Date : 02 . 06 . 2020
Written by : farag & oZ-Zo
Thanks to all http : / / forum . ru-board . com members involved
Ask a question on
- http : / / forum . ru-board . com / topic . cgi ? forum = 62 & topic = 30617 #15
- https : / / habr . com / en / post / 465365 /
- https : / / 4pda . ru / forum / index . php ? s = & showtopic = 523489 & view = findpost & p = 95909388
- https : / / forums . mydigitallife . net / threads / powershell-script -setup -windows - 10 . 80139 /
- https : / / www . reddit . com / r / Windows10 / comments / ctg8jw / powershell_script_setup_windows_10 /
Copyright ( c ) 2020 farag
http : / / forum . ru-board . com / topic . cgi ? forum = 62 & topic = 30617 #15
https : / / habr . com / en / post / 465365 /
https : / / 4pda . ru / forum / index . php ? showtopic = 523489 & st = 42860 #entry95909388
https : / / forums . mydigitallife . net / threads / powershell-script -setup -windows - 10 . 81675 /
https : / / www . reddit . com / r / PowerShell / comments / go2n5v / powershell_script_setup_windows_10 /
Copyright ( c ) 2020 farag & oZ-Zo
. LINK
https : / / github . com / farag2 / Windows - 10 -Setup -Script
#>
@ -55,7 +57,9 @@ else
# Detect the OS bitness
# Определить разрядность ОС
if ( -not ( [Environment] :: Is64BitOperatingSystem ) )
switch ( [Environment] :: Is64BitOperatingSystem )
{
$false
{
if ( $RU )
{
@ -67,10 +71,14 @@ if (-not ([Environment]::Is64BitOperatingSystem))
}
break
}
Default { }
}
# Detect the PowerShell bitness
# Определить разрядность PowerShell
if ( -not ( [IntPtr] :: Size -eq 8 ) )
switch ( [IntPtr] :: Size -eq 8 )
{
$false
{
if ( $RU )
{
@ -82,6 +90,8 @@ if (-not ([IntPtr]::Size -eq 8))
}
break
}
Default { }
}
# Detect whether the script is running via PowerShell ISE
# Определить, запущен ли скрипт в PowerShell ISE
@ -229,7 +239,7 @@ New-ItemProperty -Path HKLM:\System\CurrentControlSet\Services\UserDataSvc -Name
# Stop event trace sessions
# Остановить сеансы отслеживания событий
Get-EtwTraceSession -Name DiagLog -ErrorAction Ignore | Remove-EtwTraceSession
Get-EtwTraceSession -Name DiagLog -ErrorAction Ignore | Remove-EtwTraceSession -ErrorAction Ignore
# Turn off the data collectors at the next computer restart
# Отключить сборщики данных при следующем запуске ПК
@ -428,7 +438,6 @@ New-ItemProperty -Path HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\
# Increase taskbar transparency
# Увеличить прозрачность панели задач
New-ItemProperty -Path HKLM : \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Advanced -Name UseOLEDTaskbarTransparency -PropertyType DWord -Value 1 -Force
New-ItemProperty -Path HKLM : \ SOFTWARE \ Microsoft \ Windows \ Dwm -Name ForceEffectMode -PropertyType DWord -Value 1 -Force
# Do not show when snapping a window, what can be attached next to it
# Не показывать при прикреплении окна, что можно прикрепить рядом с ним
@ -693,12 +702,14 @@ if ($UninstallString)
{
Write-Verbose -Message " Uninstalling OneDrive " -Verbose
}
Stop-Process -Name OneDrive -Force
Stop-Process -Name FileCoAuth -ErrorAction Ignore -Force
Stop-Process -Name OneDrive -Force -ErrorAction Ignore
Stop-Process -Name FileCoAuth -Force -ErrorAction Ignore
# Save all opened folders in order to restore them after File Explorer restarting
# Сохранить все открытые папки, чтобы восстановить их после перезапуска проводника
Clear-Variable -Name OpenedFolders -Force -ErrorAction Ignore
$OpenedFolders = { ( New-Object -ComObject Shell . Application ) . Windows ( ) | ForEach-Object -Process { $_ . Document . Folder . Self . Path } } . Invoke ( )
# Getting link to the OneDriveSetup.exe and its' argument(s)
# Получаем ссылку на OneDriveSetup.exe и его аргумент(ы)
[string[]] $OneDriveSetup = ( $UninstallString -Replace ( " \s*/ " , " ,/ " ) ) . Split ( " , " ) . Trim ( )
@ -711,6 +722,7 @@ if ($UninstallString)
Start-Process -FilePath $OneDriveSetup [ 0 ] -ArgumentList $OneDriveSetup [ 1 . . 2 ] -Wait
}
Stop-Process -Name explorer -Force
# Restoring closed folders
# Восстановляем закрытые папки
foreach ( $OpenedFolder in $OpenedFolders )
@ -720,6 +732,7 @@ if ($UninstallString)
Invoke-Item -Path $OpenedFolder
}
}
# Getting the OneDrive user folder path
# Получаем путь до папки пользователя OneDrive
$OneDriveUserFolder = Get-ItemPropertyValue -Path HKCU : \ Environment -Name OneDrive
@ -739,12 +752,14 @@ if ($UninstallString)
}
Invoke-Item -Path $OneDriveUserFolder
}
Remove-ItemProperty -Path HKCU : \ Environment -Name OneDrive , OneDriveConsumer -Force -ErrorAction Ignore
Remove-Item -Path HKCU : \ Software \ Microsoft \ OneDrive -Recurse -Force -ErrorAction Ignore
Remove-Item -Path HKLM : \ SOFTWARE \ WOW6432Node \ Microsoft \ OneDrive -Recurse -Force -ErrorAction Ignore
Remove-Item -Path " $ env:ProgramData\Microsoft OneDrive " -Recurse -Force -ErrorAction Ignore
Remove-Item -Path $env:SystemDrive \ OneDriveTemp -Recurse -Force -ErrorAction Ignore
Unregister-ScheduledTask -TaskName * OneDrive * -Confirm : $false
# Getting the OneDrive folder path
# Получаем путь до папки OneDrive
$OneDriveFolder = Split-Path -Path ( Split-Path -Path $OneDriveSetup [ 0 ] -Parent )
@ -781,9 +796,11 @@ if ($UninstallString)
}
while ( $Locked )
}
Remove-Item -Path $OneDriveFolder -Recurse -Force
Remove-Item -Path $OneDriveFolder -Recurse -Force -ErrorAction Ignore
Remove-Item -Path $env:LOCALAPPDATA \ OneDrive -Recurse -Force -ErrorAction Ignore
Remove-Item -Path $env:LOCALAPPDATA \ Microsoft \ OneDrive -Recurse -Force -ErrorAction Ignore
Remove-Item -Path " $ env:APPDATA\Microsoft\Windows\Start Menu\Programs\OneDrive.lnk " -Force -ErrorAction Ignore
}
#endregion OneDrive
@ -973,7 +990,7 @@ $ExcludedCapabilities = @(
< Window
xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "
xmlns : x = " http://schemas.microsoft.com/winfx/2006/xaml "
Name = " Window " Title = " Capabilities to uninstall "
Name = " Window "
MinHeight = " 450 " MinWidth = " 400 "
SizeToContent = " Width " WindowStartupLocation = " CenterScreen "
TextOptions . TextFormattingMode = " Display " SnapsToDevicePixels = " True "
@ -1004,7 +1021,7 @@ $ExcludedCapabilities = @(
VerticalScrollBarVisibility = " Auto " >
< StackPanel Name = " PanelContainer " Orientation = " Vertical " / >
< / ScrollViewer >
< Button Name = " Button " Grid . Row = " 1 " Content = " Uninstall " / >
< Button Name = " Button " Grid . Row = " 1 " / >
< / Grid >
< / Window >
'
@ -1103,6 +1120,17 @@ $Window.Add_Loaded({
Add-CapabilityControl -Capability $_
}
$OFS = " "
if ( $RU )
{
$Window . Title = " Удалить дополнительные компоненты "
$Button . Content = " Удалить "
}
else
{
$Window . Title = " Capabilities to Uninstall "
$Button . Content = " Uninstall "
}
} )
# Button Click Event
@ -1117,10 +1145,10 @@ if (Get-WindowsCapability -Online | Where-Object -FilterScript {($_.State -eq "I
}
else
{
Write-Verbose "Form opening... " -Verbose
Write-Verbose -Message "Form opening... " -Verbose
}
# Display form
# Display форму
# Отобразить форму
$Form . ShowDialog ( ) | Out-Null
}
else
@ -1131,7 +1159,7 @@ else
}
else
{
Write-Verbose "Отсутствуют дополнительные компоненты для отображения " -Verbose
Write-Verbose -Message "Отсутствуют дополнительные компоненты для отображения " -Verbose
}
}
@ -1244,8 +1272,17 @@ if (Get-WindowsEdition -Online | Where-Object -FilterScript {$_.Edition -eq "Pro
# Change location of the user folders
# Изменить расположение пользовательских папок
<#
. SYNOPSIS
Change location of the each user folders using SHSetKnownFolderPath function
. EXAMPLE
UserShellFolder -UserFolder Desktop -FolderPath " C:\Desktop "
. NOTES
User files or folders won ' t me moved to the new location
#>
function KnownFolderPath
{
[ CmdletBinding ( ) ]
param
(
[ Parameter ( Mandatory = $true ) ]
@ -1287,6 +1324,7 @@ function KnownFolderPath
function UserShellFolder
{
[ CmdletBinding ( ) ]
param
(
[ Parameter ( Mandatory = $true ) ]
@ -1317,6 +1355,8 @@ function UserShellFolder
" Videos " = " {35286A68-3C57-41A1-BBB1-0EAE73D76C95} "
}
# Hidden desktop.ini for each type of user folders
# Скрытый desktop.ini для каждого типа пользовательских папок
$DesktopINI = @ {
" Desktop " = " " ,
" [.ShellClassInfo] " ,
@ -1351,6 +1391,8 @@ function UserShellFolder
" IconFile=%SystemRoot%\system32\shell32.dll " , " IconIndex=-238 "
}
# Checking the current user folder path
# Проверяем текущее значение пути пользовательской папки
$UserShellFolderRegValue = Get-ItemPropertyValue -Path " HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders " -Name $UserShellFoldersRegName [ $UserFolder ]
if ( $UserShellFolderRegValue -ne $FolderPath )
{
@ -1365,23 +1407,36 @@ function UserShellFolder
Write-Error -Message " Some files left in the $ UserShellFolderRegValue folder. Move them manually to a new location " -ErrorAction SilentlyContinue
}
}
# Creating a new folder if there is no one
# Создаем новую папку, если таковая отсутствует
if ( -not ( Test-Path -Path $FolderPath ) )
{
New-Item -Path $FolderPath -ItemType Directory -Force
}
KnownFolderPath -KnownFolder $UserFolder -Path $FolderPath
New-ItemProperty -Path " HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders " -Name $UserShellFoldersGUID [ $UserFolder ] -PropertyType ExpandString -Value $FolderPath -Force
Set-Content -Path " $ FolderPath\desktop.ini " -Value $DesktopINI [ $UserFolder ] -Encoding Unicode -Force
( Get-Item -Path " $ FolderPath\desktop.ini " -Force ) . Attributes = " Hidden " , " System " , " Archive "
( Get-Item -Path " $ FolderPath\desktop.ini " -Force ) . Refresh ( )
}
}
<#
. SYNOPSIS
The " Show menu " function using PowerShell with the up / down arrow keys and enter key to make a selection
. EXAMPLE
ShowMenu -Menu $ListOfItems -Default $DefaultChoice
. NOTES
Doesn ' t work in PowerShell ISE
#>
function ShowMenu
{
[ CmdletBinding ( ) ]
param
(
[ Parameter ( Mandatory = $true ) ]
[ Parameter ( ) ]
[string]
$Title ,
@ -1452,11 +1507,14 @@ function ShowMenu
while ( $k . Key -notin ( [ConsoleKey] :: Escape , [ConsoleKey] :: Enter ) )
}
# Store all drives letters to use them within ShowMenu function
# Сохранить все буквы диска, чтобы использовать их в функции ShowMenu
$DriveLetters = @ ( ( Get-Disk | Where-Object -FilterScript { $_ . BusType -ne " USB " } | Get-Partition | Get-Volume | Where-Object -FilterScript { $null -ne $_ . DriveLetter } ) . DriveLetter | Sort-Object )
if ( $DriveLetters . Count -gt 1 )
{
# If drive letters count is more than, then make the second drive in the list the default drive
# Если количество букв дисков больше одного, то сделать второй диск в списке диском по умолчанию
# If the number of disks is more than one, set the second drive in the list as default drive
# Если количество дисков больше одного, сделать второй диск в списке диском по умолчанию
$Default = 1
}
else
@ -1466,81 +1524,280 @@ else
# Desktop
# Рабочий стол
$Title = " "
if ( $RU )
{
$Title = " Выберите букву диска, в корне которого будет создана папка для `" Рабочий стол `" . `n Файлы не будут перенесены: сделайте это вручную "
$Message = " Чтобы изменить местоположение папки `" Рабочий стол `" , введите необходимую букву "
Write-Warning " `n Файлы не будут перенесены "
$Options = " &Изменить " , " &Пропустить "
}
else
{
$Title = " Choose the drive letter in the root of which the `" Desktop `" folder will be created. `n Files will not be moved. Do it manually "
$Message = " To change the location of the Desktop folder enter the required letter "
Write-Warning " `n Files will not be moved "
$Options = " &Change " , " &Skip "
}
$DefaultChoice = 1
$Result = $Host . UI . PromptForChoice ( $Title , $Message , $Options , $DefaultChoice )
switch ( $Result )
{
" 0 "
{
if ( $RU )
{
$Title = " `n Выберите диск, в корне которого будет создана папка для `" Рабочий стол `" "
}
else
{
$Title = " `n Select the drive within the root of which the `" Desktop `" folder will be created "
}
$SelectedDrive = ShowMenu -Title $Title -Menu $DriveLetters -Default $Default
UserShellFolder -UserFolder Desktop -FolderPath " $ {SelectedDrive}:\Desktop "
}
" 1 "
{
if ( $RU )
{
Write-Verbose -Message " Пропущено " -Verbose
}
else
{
Write-Verbose -Message " Skipped " -Verbose
}
}
}
# Documents
# Документы
$Title = " "
if ( $RU )
{
$Title = " Выберите букву диска, в корне которого будет создана папка для `" Документы `" . `n Файлы не будут перенесены: сделайте это вручную "
$Message = " Чтобы изменить местоположение папки `" Документы `" , введите необходимую букву "
Write-Warning " `n Файлы не будут перенесены "
$Options = " &Изменить " , " &Пропустить "
}
else
{
$Title = " Choose the drive letter in the root of which the `" Documents `" folder will be created. `n Files will not be moved. Do it manually "
$Message = " To change the location of the Documents folder enter the required letter "
Write-Warning " `n Files will not be moved "
$Options = " &Change " , " &Skip "
}
$DefaultChoice = 1
$Result = $Host . UI . PromptForChoice ( $Title , $Message , $Options , $DefaultChoice )
switch ( $Result )
{
" 0 "
{
if ( $RU )
{
$Title = " `n Выберите диск, в корне которого будет создана папка для `" Документы `" "
}
else
{
$Title = " `n Select the drive within the root of which the `" Documents `" folder will be created "
}
$SelectedDrive = ShowMenu -Title $Title -Menu $DriveLetters -Default $Default
UserShellFolder -UserFolder Documents -FolderPath " $ {SelectedDrive}:\Documents "
}
" 1 "
{
if ( $RU )
{
Write-Verbose -Message " Пропущено " -Verbose
}
else
{
Write-Verbose -Message " Skipped " -Verbose
}
}
}
# Downloads
# Загрузки
$Title = " "
if ( $RU )
{
$Title = " Выберите букву диска, в корне которого будет создана папка для `" Загрузки `" "
$Message = " Чтобы изменить местоположение папки `" Загрузки `" , введите необходимую букву "
Write-Warning " `n Файлы не будут перенесены "
$Options = " &Изменить " , " &Пропустить "
}
else
{
$Title = " Choose the drive letter in the root of which the `" Downloads `" folder will be created. `n Files will not be moved. Do it manually "
$Message = " To change the location of the Downloads folder enter the required letter "
Write-Warning " `n Files will not be moved "
$Options = " &Change " , " &Skip "
}
$DefaultChoice = 1
$Result = $Host . UI . PromptForChoice ( $Title , $Message , $Options , $DefaultChoice )
switch ( $Result )
{
" 0 "
{
if ( $RU )
{
$Title = " `n Выберите диск, в корне которого будет создана папка для `" Загрузки `" "
}
else
{
$Title = " `n Select the drive within the root of which the `" Downloads `" folder will be created "
}
$SelectedDrive = ShowMenu -Title $Title -Menu $DriveLetters -Default $Default
UserShellFolder -UserFolder Downloads -FolderPath " $ {SelectedDrive}:\Downloads "
}
" 1 "
{
if ( $RU )
{
Write-Verbose -Message " Пропущено " -Verbose
}
else
{
Write-Verbose -Message " Skipped " -Verbose
}
}
}
# Music
# Музыка
$Title = " "
if ( $RU )
{
$Title = " Выберите букву диска, в корне которого будет создана папка для `" Музыка `" . `n Файлы не будут перенесены: сделайте это вручную "
$Message = " Чтобы изменить местоположение папки `" Музыка `" , введите необходимую букву "
Write-Warning " `n Файлы не будут перенесены "
$Options = " &Изменить " , " &Пропустить "
}
else
{
$Title = " Choose the drive letter in the root of which the `" Music `" folder will be created. `n Files will not be moved. Do it manually "
$Message = " To change the location of the Music folder enter the required letter "
Write-Warning " `n Files will not be moved "
$Options = " &Change " , " &Skip "
}
$DefaultChoice = 1
$Result = $Host . UI . PromptForChoice ( $Title , $Message , $Options , $DefaultChoice )
switch ( $Result )
{
" 0 "
{
if ( $RU )
{
$Title = " `n Выберите диск, в корне которого будет создана папка для `" Музыка `" "
}
else
{
$Title = " `n Select the drive within the root of which the `" Music `" folder will be created "
}
$SelectedDrive = ShowMenu -Title $Title -Menu $DriveLetters -Default $Default
UserShellFolder -UserFolder Music -FolderPath " $ {SelectedDrive}:\Music "
}
" 1 "
{
if ( $RU )
{
Write-Verbose -Message " Пропущено " -Verbose
}
else
{
Write-Verbose -Message " Skipped " -Verbose
}
}
}
# Pictures
# Изображения
$Title = " "
if ( $RU )
{
$Message = " Чтобы изменить местоположение папки `" Изображения `" , введите необходимую букву "
Write-Warning " `n Файлы не будут перенесены "
$Options = " &Изменить " , " &Пропустить "
}
else
{
$Message = " To change the location of the Pictures folder enter the required letter "
Write-Warning " `n Files will not be moved "
$Options = " &Change " , " &Skip "
}
$DefaultChoice = 1
$Result = $Host . UI . PromptForChoice ( $Title , $Message , $Options , $DefaultChoice )
switch ( $Result )
{
" 0 "
{
if ( $RU )
{
$Title = " Выберите букву диска, в корне которого будет создана папка для `" Изображения `" . `n Файлы не будут перенесены: сделайте это вручную "
$Title = " `n Выберите диск, в корне которого будет создана папка для `" Изображения `" "
}
else
{
$Title = " Choose the drive letter in the root of which the `" Pictures `" folder will be created. `n Files will not be moved. Do it manually "
$Title = " `n Select the drive with in the root of which the `" Pictures `" folder will be created "
}
$SelectedDrive = ShowMenu -Title $Title -Menu $DriveLetters -Default $Default
UserShellFolder -UserFolder Pictures -FolderPath " $ {SelectedDrive}:\Pictures "
}
" 1 "
{
if ( $RU )
{
Write-Verbose -Message " Пропущено " -Verbose
}
else
{
Write-Verbose -Message " Skipped " -Verbose
}
}
}
# Videos
# Видео
$Title = " "
if ( $RU )
{
$Message = " Чтобы изменить местоположение папки `" Видео `" , введите необходимую букву "
Write-Warning " `n Файлы не будут перенесены "
$Options = " &Изменить " , " &Пропустить "
}
else
{
$Message = " To change the location of the Videos folder enter the required letter "
Write-Warning " `n Files will not be moved "
$Options = " &Change " , " &Skip "
}
$DefaultChoice = 1
$Result = $Host . UI . PromptForChoice ( $Title , $Message , $Options , $DefaultChoice )
switch ( $Result )
{
" 0 "
{
if ( $RU )
{
$Title = " Выберите букву диска, в корне которого будет создана папка для `" Видео `" . `n Файлы не будут перенесены: сделайте это вручную "
$Title = " `n Выберите диск, в корне которого будет создана папка для `" Видео `" "
}
else
{
$Title = " Choose the drive letter in the root of which the `" Videos `" folder will be created. `n Files will not be moved. Do it manually "
$Title = " `n Select the drive with in the root of which the `" Videos `" folder will be created "
}
$SelectedDrive = ShowMenu -Title $Title -Menu $DriveLetters -Default $Default
UserShellFolder -UserFolder Videos -FolderPath " $ {SelectedDrive}:\Videos "
}
" 1 "
{
if ( $RU )
{
Write-Verbose -Message " Пропущено " -Verbose
}
else
{
Write-Verbose -Message " Skipped " -Verbose
}
}
}
# Turn on automatic recommended troubleshooting and tell when problems get fixed
# Автоматически запускать средства устранения неполадок, а затем сообщать об устранении проблем
@ -1569,7 +1826,7 @@ if (-not (Test-Path -Path "HKCU:\Software\Classes\Typelib\{8cec5860-07a1-11d9-b1
{
New-Item -Path " HKCU:\Software\Classes\Typelib\{8cec5860-07a1-11d9-b15e-000d56bfe6ee}\1.0\0\win64 " -Force
}
New-ItemProperty -Path " HKCU:\Software\Classes\Typelib\{8cec5860-07a1-11d9-b15e-000d56bfe6ee}\1.0\0\win64 " -Name " (d efault) " -PropertyType String -Value " " -Force
New-ItemProperty -Path " HKCU:\Software\Classes\Typelib\{8cec5860-07a1-11d9-b15e-000d56bfe6ee}\1.0\0\win64 " -Name " (D efault) " -PropertyType String -Value " " -Force
# Turn on Num Lock at startup
# Включить Num Lock при загрузке
@ -1633,7 +1890,7 @@ $Data += ",5,134,145,204,147,5,36,170,163,1,68,195,132,1,102,159,247,157,177,135
$Data + = " ,194,60,1,194,70,1,197,90,1,0 "
New-ItemProperty -Path $StartMenu . PSPath -Name Data -PropertyType Binary -Value $Data . Split ( " , " ) -Force
# Unpin all the Start menu tiles
# Unpin all the Start tiles
# Открепить все ярлыки от начального экрана
if ( $RU )
{
@ -1695,13 +1952,14 @@ else
{
if ( $RU )
{
Write-Warning "Отсутствует интернет-соединение " -ErrorAction SilentlyContinue
Write-Warning -Message "Отсутствует интернет-соединение " -ErrorAction SilentlyContinue
}
else
{
Write-Warning "No Internet connection " -ErrorAction SilentlyContinue
Write-Warning -Message "No Internet connection " -ErrorAction SilentlyContinue
}
}
Add-Type -AssemblyName System . Windows . Forms
$OpenFileDialog = New-Object -TypeName System . Windows . Forms . OpenFileDialog
$OpenFileDialog . InitialDirectory = $DownloadsFolder
@ -1718,6 +1976,7 @@ else
# Перевести фокус на диалог открытия файла
$tmp = New-Object -TypeName System . Windows . Forms . Form -Property @ { TopMost = $true }
$OpenFileDialog . ShowDialog ( $tmp )
if ( $OpenFileDialog . FileName )
{
# Pin "Control Panel" to Start
@ -1755,6 +2014,7 @@ if ($OpenFileDialog.FileName)
Start-Process -FilePath $OpenFileDialog . FileName -WindowStyle Hidden -ArgumentList $Arguments -Wait
Remove-Item -Path " $ env:SystemRoot\System32\ $ ControlPanelLocalizedName.lnk " -Force
}
# Pin "Devices and Printers" to Start
# Create old style shortcut for the "Devices and Printers" in the Start menu
# Закрепить "Устройства и принтеры" на начальном экране
@ -1781,6 +2041,7 @@ if ($OpenFileDialog.FileName)
" $ env:APPDATA\Microsoft\Windows\Start menu\Programs\System Tools\ $ DevicesAndPrintersLocalizedName.lnk " " 51201 "
" @
Start-Process -FilePath $OpenFileDialog . FileName -WindowStyle Hidden -ArgumentList $Arguments -Wait
# Pin "Command Prompt" to Start
# Закрепить "Командную строку" на начальном экране
if ( $RU )
@ -1796,9 +2057,11 @@ if ($OpenFileDialog.FileName)
" @
Start-Process -FilePath $OpenFileDialog . FileName -WindowStyle Hidden -ArgumentList $Arguments -Wait
}
# Delete downloaded syspin.exe
# Удалить скачанный syspin.exe
Remove-Item -Path " $ DownloadsFolder\syspin.exe " -Force
# Restart the Start menu
# Перезапустить меню "Пуск"
Stop-Process -Name StartMenuExperienceHost -Force
@ -1831,12 +2094,12 @@ New-ItemProperty -Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer
Uninstall UWP apps from all accounts
A form with the ability to select the package to remove
App packages will not be installed when new user accounts are created
Add UWP apps packages names to the $UnchekedAppXPackages array list by retrieving their packages names with ( Get-AppxPackage -PackageTypeFilter Bundle -AllUsers ) . Name command
Add UWP apps packages names to the $Unchec kedAppXPackages array list by retrieving their packages names with ( Get-AppxPackage -PackageTypeFilter Bundle -AllUsers ) . Name command
Удалить UWP - приложения из всех учетных записей
Форма с возможностью выбрать пакет для удаления
Приложения не будут установлены при создании новых учетных записей
Добавьте имена пакетов UWP - приложений в массив $UnchekedAppXPackages , получив названия их пакетов с помощью команды ( Get-AppxPackage -PackageTypeFilter Bundle -AllUsers ) . Name
Добавьте имена пакетов UWP - приложений в массив $Unchec kedAppXPackages , получив названия их пакетов с помощью команды ( Get-AppxPackage -PackageTypeFilter Bundle -AllUsers ) . Name
#>
Add-Type -AssemblyName PresentationCore , PresentationFramework
@ -1909,7 +2172,7 @@ $ExcludedAppxPackages = @(
< Window
xmlns = " http://schemas.microsoft.com/winfx/2006/xaml/presentation "
xmlns : x = " http://schemas.microsoft.com/winfx/2006/xaml "
Name = " Window " Title = " Packages to uninstall "
Name = " Window "
MinHeight = " 450 " MinWidth = " 400 "
SizeToContent = " Width " WindowStartupLocation = " CenterScreen "
TextOptions . TextFormattingMode = " Display " SnapsToDevicePixels = " True "
@ -1932,15 +2195,26 @@ $ExcludedAppxPackages = @(
< / Window . Resources >
< Grid >
< Grid . RowDefinitions >
< RowDefinition Height = " Auto " / >
< RowDefinition Height = " * " / >
< RowDefinition Height = " Auto " / >
< / Grid . RowDefinitions >
< ScrollViewer Name = " Scroll " Grid . Row = " 0 "
< Grid Grid . Row = " 0 " >
< Grid . ColumnDefinitions >
< ColumnDefinition Width = " * " / >
< ColumnDefinition Width = " Auto " / >
< / Grid . ColumnDefinitions >
< StackPanel Grid . Column = " 1 " Orientation = " Horizontal " >
< CheckBox Name = " CheckboxRemoveAll " IsChecked = " False " / >
< TextBlock Name = " TextblockRemoveAll " / >
< / StackPanel >
< / Grid >
< ScrollViewer Name = " Scroll " Grid . Row = " 1 "
HorizontalScrollBarVisibility = " Disabled "
VerticalScrollBarVisibility = " Auto " >
< StackPanel Name = " PanelContainer " Orientation = " Vertical " / >
< / ScrollViewer >
< Button Name = " Button " Grid . Row = " 1 " Content = " Uninstall " / >
< Button Name = " Button " Grid . Row = " 2 " / >
< / Grid >
< / Window >
'
@ -1989,7 +2263,14 @@ function DeleteButton
{
[void] $Window . Close ( )
$OFS = " | "
if ( $CheckboxRemoveAll . IsChecked )
{
Get-AppxPackage -PackageTypeFilter Bundle -AllUsers | Where-Object -FilterScript { $_ . Name -cmatch $AppxPackages } | Remove-AppxPackage -AllUsers -Verbose
}
else
{
Get-AppxPackage -PackageTypeFilter Bundle | Where-Object -FilterScript { $_ . Name -cmatch $AppxPackages } | Remove-AppxPackage -Verbose
}
$OFS = " "
}
@ -2041,6 +2322,19 @@ $Window.Add_Loaded({
Add-AppxControl -AppxName $_
}
$OFS = " "
if ( $RU )
{
$TextblockRemoveAll . Text = " Удалять для всех пользователей "
$Window . Title = " Удалить UWP-приложения "
$Button . Content = " Удалить "
}
else
{
$TextblockRemoveAll . Text = " Uninstall for All Users "
$Window . Title = " UWP Packages to Uninstall "
$Button . Content = " Uninstall "
}
} )
# Button Click Event
@ -2055,10 +2349,10 @@ if (Get-AppxPackage -PackageTypeFilter Bundle -AllUsers | Where-Object -FilterSc
}
else
{
Write-Verbose "Form opening... " -Verbose
Write-Verbose -Message "Form opening... " -Verbose
}
# Display form
# Display форму
# Отобразить форму
$Form . ShowDialog ( ) | Out-Null
}
else
@ -2069,7 +2363,7 @@ else
}
else
{
Write-Verbose "Отсутствуют UWP-приложения для отображения " -Verbose
Write-Verbose -Message "Отсутствуют UWP-приложения для отображения " -Verbose
}
}
@ -2166,7 +2460,7 @@ if (Get-CimInstance -ClassName Win32_VideoController | Where-Object -FilterScrip
{
$OpenFileDialog . Filter = " *.exe|*.exe|All Files (*.*)|*.* "
}
$OpenFileDialog . InitialDirectory = " $ env:ProgramFiles} "
$OpenFileDialog . InitialDirectory = " $ { env:ProgramFiles(x86) }"
$OpenFileDialog . Multiselect = $false
# Focus on open file dialog
# Перевести фокус на диалог открытия файла
@ -2242,7 +2536,7 @@ if ($PSUICulture -eq "ru-RU")
< toast launch = " app-defined-string " >
< visual >
< binding template = " ToastGeneric " >
< text > Очистка неиспользуемых обновлений начнется через минуту < / text >
< text > Очистка неиспользуемых файлов и обновлений Windows начнется через минуту < / text >
< / binding >
< / visual >
< actions >
@ -2257,7 +2551,7 @@ else
< toast launch = " app-defined-string " >
< visual >
< binding template = " ToastGeneric " >
< text > Cleaning up unused updates will start in a minute < / text >
< text > Cleaning up unused Windows files and updates start in a minute < / text >
< / binding >
< / visual >
< actions >
@ -2276,7 +2570,7 @@ Start-Sleep -Seconds 60
# Process startup info
# Параметры запуска процесса
$ProcessInfo = New-Object System . Diagnostics . ProcessStartInfo
$ProcessInfo = New-Object -TypeName System . Diagnostics . ProcessStartInfo
$ProcessInfo . FileName = " $ env:SystemRoot\system32\cleanmgr.exe "
$ProcessInfo . Arguments = " /sagerun:1337 "
$ProcessInfo . UseShellExecute = $true
@ -2331,7 +2625,7 @@ while ($true)
Start-Sleep -Milliseconds 5
}
$ProcessInfo = New-Object System . Diagnostics . ProcessStartInfo
$ProcessInfo = New-Object -TypeName System . Diagnostics . ProcessStartInfo
# Cleaning up unused updates
# Очистка неиспользованных обновлений
$ProcessInfo . FileName = " $ env:SystemRoot\system32\dism.exe "
@ -2577,23 +2871,23 @@ switch ($Result)
" 0 "
{
Add-Type -AssemblyName System . Windows . Forms
$OpenFile Dialog = New-Object -TypeName System . Windows . Forms . FolderBrowserDialog
$FolderBrowser Dialog = New-Object -TypeName System . Windows . Forms . FolderBrowserDialog
if ( $RU )
{
$OpenFile Dialog . Description = " Выберите папку "
$FolderBrowser Dialog . Description = " Выберите папку "
}
else
{
$OpenFile Dialog . Description = " Select a folder "
$FolderBrowser Dialog . Description = " Select a folder "
}
$OpenFile Dialog . RootFolder = " MyComputer "
$FolderBrowser Dialog . RootFolder = " MyComputer "
# Focus on open file dialog
# Перевести фокус на диалог открытия файла
$tmp = New-Object -TypeName System . Windows . Forms . Form -Property @ { TopMost = $true }
$OpenFile Dialog . ShowDialog ( $tmp )
if ( $OpenFile Dialog . SelectedPath )
$FolderBrowser Dialog . ShowDialog ( $tmp )
if ( $FolderBrowser Dialog . SelectedPath )
{
Add-MpPreference -ExclusionPath $OpenFile Dialog . SelectedPath -Force
Add-MpPreference -ExclusionPath $FolderBrowser Dialog . SelectedPath -Force
}
$Host . UI . PromptForChoice ( $Title , $Message , $Options , $DefaultChoice )
}
@ -2614,13 +2908,13 @@ switch ($Result)
# Добавить файл в список исключений сканирования Microsoft Defender
if ( $RU )
{
$Title = " Microsoft Defender"
$Title = " Windows Defender"
$Message = " Чтобы исключить файл из списка сканирования антивредоносной программы Microsoft Defender, введите необходимую букву "
$Options = " &Исключить файл " , " &Пропустить "
}
else
{
$Title = " Microsoft Defender"
$Title = " Windows Defender"
$Message = " To exclude file from Microsoft Defender Antivirus Scan enter the required letter "
$Options = " &Exclude file " , " &Skip "
}
@ -2735,23 +3029,20 @@ New-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows Script Host\Settings" -
#endregion Windows Defender & Security
#region Context menu
# Add "Extract" item to Windows Installer (.msi) context menu
# Add the "Extract" item to Windows Installer (.msi) context menu
# Добавить пункт "Извлечь" в контекстное меню Windows Installer (.msi)
if ( -not ( Test-Path -Path Registry :: HKEY_CLASSES_ROOT \ Msi . Package \ shell \ Extract \ Command ) )
{
New-Item -Path Registry :: HKEY_CLASSES_ROOT \ Msi . Package \ shell \ Extract \ Command -Force
}
$Value = " {0} " -f 'msiexec.exe /a "%1" /qb TARGETDIR="%1 extracted"'
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ Msi . Package \ shell \ Extract \ Command -Name " (d efault) " -PropertyType String -Value $Value -Force
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ Msi . Package \ shell \ Extract \ Command -Name " (D efault) " -PropertyType String -Value $Value -Force
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ Msi . Package \ shell \ Extract -Name MUIVerb -PropertyType String -Value " @shell32.dll,-31382 " -Force
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ Msi . Package \ shell \ Extract -Name Icon -PropertyType String -Value " shell32.dll,-16817 " -Force
# Add "Run as different user" item to the .exe files types context menu
# Add the "Run as different user" item to the .exe files types context menu
# Добавить "Запуск от имени другого пользователя" в контекстное меню .exe файлов
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ exefile \ shell \ runasuser -Name " (default) " -PropertyType String -Value " @shell32.dll,-50944 " -Force
Remove-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ exefile \ shell \ runasuser -Name Extended -Force -ErrorAction Ignore
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ exefile \ shell \ runasuser -Name SuppressionPolicyEx -PropertyType String -Value " {F211AA05-D4DF-4370-A2A0-9F19C09756A7} " -Force
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ exefile \ shell \ runasuser \ command -Name DelegateExecute -PropertyType String -Value " {ea72d00e-4960-42fa-ba92-7792a7944c1d} " -Force
# Add the "Install" item to the .cab archives context menu
# Добавить пункт "Установить" в контекстное меню .cab архивов
@ -2760,11 +3051,11 @@ if (-not (Test-Path -Path Registry::HKEY_CLASSES_ROOT\CABFolder\Shell\RunAs\Comm
New-Item -Path Registry :: HKEY_CLASSES_ROOT \ CABFolder \ Shell \ RunAs \ Command -Force
}
$Value = " {0} " -f 'cmd /c DISM.exe /Online /Add-Package /PackagePath:"%1" /NoRestart & pause'
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ CABFolder \ Shell \ RunAs \ Command -Name " (d efault) " -PropertyType String -Value $Value -Force
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ CABFolder \ Shell \ RunAs \ Command -Name " (D efault) " -PropertyType String -Value $Value -Force
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ CABFolder \ Shell \ RunAs -Name MUIVerb -PropertyType String -Value " @shell32.dll,-10210 " -Force
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ CABFolder \ Shell \ RunAs -Name HasLUAShield -PropertyType String -Value " " -Force
# Hide "Cast to Device" item from the context menu
# Hide the "Cast to Device" item from the context menu
# Скрыть пункт "Передать на устройство" из контекстного меню
if ( -not ( Test-Path -Path " HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked " ) )
{
@ -2772,7 +3063,7 @@ if (-not (Test-Path -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell
}
New-ItemProperty -Path " HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked " -Name " {7AD84985-87B4-4a16-BE58-8B72A5B390F7} " -PropertyType String -Value " Play to menu " -Force
# Hide "Share" item from the context menu
# Hide the "Share" item from the context menu
# Скрыть пункт "Отправить" (поделиться) из контекстного меню
if ( -not ( Test-Path -Path " HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked " ) )
{
@ -2780,7 +3071,7 @@ if (-not (Test-Path -Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell
}
New-ItemProperty -Path " HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked " -Name " {E2BF9676-5F8F-435C-97EB-11607A5BEDF7} " -PropertyType String -Value " " -Force
# Hide "Edit with Paint 3D" item from the context menu
# Hide the "Edit with Paint 3D" item from the context menu
# Скрыть пункт "Изменить с помощью Paint 3D" из контекстного меню
$extensions = @ ( " .bmp " , " .gif " , " .jpe " , " .jpeg " , " .jpg " , " .png " , " .tif " , " .tiff " )
foreach ( $extension in $extensions )
@ -2788,12 +3079,12 @@ foreach ($extension in $extensions)
New-ItemProperty -Path " Registry::HKEY_CLASSES_ROOT\SystemFileAssociations\ $ extension\Shell\3D Edit " -Name ProgrammaticAccessOnly -PropertyType String -Value " " -Force
}
# Hide "Include in Library" item from the context menu
# Hide the "Include in Library" item from the context menu
# Скрыть пункт "Добавить в библиотеку" из контекстного меню
New-ItemProperty -Path " Registry::HKEY_CLASSES_ROOT\Folder\shellex\ContextMenuHandlers\Library Location " -Name " (d efault) " -PropertyType String -Value " -{3dad6c5d-2167-4cae-9914-f99e41c12cfa} " -Force
New-ItemProperty -Path " Registry::HKEY_CLASSES_ROOT\Folder\shellex\ContextMenuHandlers\Library Location " -Name " (D efault) " -PropertyType String -Value " -{3dad6c5d-2167-4cae-9914-f99e41c12cfa} " -Force
# Remov e "Turn on BitLocker" item from the context menu
# Удали ть пункт "Включить BitLocker" из контекстного меню
# Hide th e "Turn on BitLocker" item from the context menu
# Скры ть пункт "Включить BitLocker" из контекстного меню
if ( Get-WindowsEdition -Online | Where-Object -FilterScript { $_ . Edition -eq " Professional " -or $_ . Edition -eq " Enterprise " } )
{
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ Drive \ shell \ encrypt-bde -Name ProgrammaticAccessOnly -PropertyType String -Value " " -Force
@ -2804,44 +3095,44 @@ if (Get-WindowsEdition -Online | Where-Object -FilterScript {$_.Edition -eq "Pro
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ Drive \ shell \ unlock-bde -Name ProgrammaticAccessOnly -PropertyType String -Value " " -Force
}
# Remov e "Edit with Photos" item from the context menu
# Удали ть пункт "Изменить с помощью приложения "Фотографии"" из контекстного меню
# Hide th e "Edit with Photos" item from the context menu
# Скры ть пункт "Изменить с помощью приложения "Фотографии"" из контекстного меню
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ AppX43hnxtbyyps62jhe9sqpdzxn1790zetc \ Shell \ ShellEdit -Name ProgrammaticAccessOnly -PropertyType String -Value " " -Force
# Remov e "Create a new video" item from the context menu
# Удали ть пункт "Создать новое видео" из контекстного меню
# Hide th e "Create a new video" item from the context menu
# Скры ть пункт "Создать новое видео" из контекстного меню
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ AppX43hnxtbyyps62jhe9sqpdzxn1790zetc \ Shell \ ShellCreateVideo -Name ProgrammaticAccessOnly -PropertyType String -Value " " -Force
# Remove "Bitmap image" item from the "New" context menu
# Удалить пункт "Точечный рисунок" из контекстного меню "Создать"
Remove-Item -Path Registry :: HKEY_CLASSES_ROOT \ . bmp \ ShellNew -Force -ErrorAction Ignore
# Hide "Edit" item from the images context menu
# Remove the "Compressed (zipped) Folder" item from the "New" context menu
# Удалить пункт "Сжатая ZIP-папка" из контекстного меню "Создать"
Remove-Item -Path Registry :: HKEY_CLASSES_ROOT \ . zip \ CompressedFolder \ ShellNew -Force -ErrorAction Ignore
# Hide the "Edit" item from the images context menu
# Скрыть пункт "Изменить" из контекстного меню изображений
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ SystemFileAssociations \ image \ shell \ edit -Name ProgrammaticAccessOnly -PropertyType String -Value " " -Force
# Remove "Print" item from the .bat and .cmd context menu
# Удали ть пункт "Печать" из контекстного меню .bat и .cmd файлов
# Hide th e "Print" item from the .bat and .cmd context menu
# Скры ть пункт "Печать" из контекстного меню .bat и .cmd файлов
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ batfile \ shell \ print -Name ProgrammaticAccessOnly -PropertyType String -Value " " -Force
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ cmdfile \ shell \ print -Name ProgrammaticAccessOnly -PropertyType String -Value " " -Force
# Remove "Compressed (zipped) Folder" from the "New" context menu
# Удалить пункт "Сжатая ZIP-папка" из контекстного меню "Создать"
Remove-Item -Path Registry :: HKEY_CLASSES_ROOT \ . zip \ CompressedFolder \ ShellNew -Force -ErrorAction Ignore
# Remove "Rich Text Document" from the "New" context menu
# Remove the "Rich Text Document" item from the "New" context menu
# Удалить пункт "Документ в формате RTF" из контекстного меню "Создать"
Remove-Item -Path Registry :: HKEY_CLASSES_ROOT \ . rtf \ ShellNew -Force -ErrorAction Ignore
# Hide "Send to" item from the folders context menu
# Hide the "Send to" item from the folders context menu
# Скрыть пункт "Отправить" из контекстного меню папок
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ AllFilesystemObjects \ shellex \ ContextMenuHandlers \ SendTo -Name " (d efault) " -PropertyType String -Value " " -Force
New-ItemProperty -Path Registry :: HKEY_CLASSES_ROOT \ AllFilesystemObjects \ shellex \ ContextMenuHandlers \ SendTo -Name " (D efault) " -PropertyType String -Value " -{7BA4C740-9E81-11CF-99D3-00AA004AE837} " -Force
# Make the "Open", "Print", "Edit" context menu items available, when more than 15 items selected
# Сделать доступными элементы контекстного меню "Открыть", "Изменить" и "Печать" при выделении более 15 элементов
New-ItemProperty -Path HKCU : \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer -Name MultipleInvokePromptMinimum -PropertyType DWord -Value 300 -Force
# Hide "Look for an app in the Microsoft Store" item in "Open with" dialog
# Hide the "Look for an app in the Microsoft Store" item in "Open with" dialog
# Скрыть пункт "Поиск приложения в Microsoft Store" в диалоге "Открыть с помощью"
if ( -not ( Test-Path -Path HKLM : \ SOFTWARE \ Policies \ Microsoft \ Windows \ Explorer ) )
{
@ -2849,7 +3140,7 @@ if (-not (Test-Path -Path HKLM:\SOFTWARE\Policies\Microsoft\Windows\Explorer))
}
New-ItemProperty -Path HKLM : \ SOFTWARE \ Policies \ Microsoft \ Windows \ Explorer -Name NoUseStoreOpenWith -PropertyType DWord -Value 1 -Force
# Hide "Previous Versions" tab from files and folders context menu and "Restore previous versions" context menu item
# Hide the "Previous Versions" tab from files and folders context menu and the "Restore previous versions" context menu item
# Скрыть вкладку "Предыдущие версии" в свойствах файлов и папок и пункт контекстного меню "Восстановить прежнюю версию"
New-ItemProperty -Path HKLM : \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Explorer -Name NoPreviousVersionsPage -PropertyType DWord -Value 1 -Force
#endregion Context menu