Хочу поделиться с вами простыми шагами по настройке Winodows после ее установки с помощью PowerShell. Все шаги я выполнял неоднократно на Windows 11, думаю, что ошибок с Windows 10 не должно возникнуть.
Настройки подключения к интернету по умолчанию
Первое, что полезно выполнить, если в процессе будут использоваться различные ВПН - это сделать подключение по умолчанию самым приоритетным.
Проверьте какие подключения у вас доступны, с помощью Windows PowerShell, запущенного от имени Администратора:
Get-NetIPInterface -AddressFamily IPv4
Установите минимальное значение InterfaceMetric для вашего текущего подключения:
Set-NetIPInterface -InterfaceIndex 19 -InterfaceMetric 5
Перезагрузите сетевой интерфейс, метрику которому вы изменили:
Restart-NetAdapter -InterfaceAlias "Ethernet"
Установка PowerShell
Второе, что я обычно делаю - это устанавливаю PowerShell (fork of Windows PowerShell) и обновляю два приложения через Microsoft Store, чтобы использовать менеджер пакетов Winget:
Terminal
App Installer
После этого можно перейти к третьему шагу.
Установка приложений с помощью Winget
Создайте список приложений с помощью блокнота. Вот мой стандартный список:
notepad.exe .\PowerShellInstall_Winget_Machine.ps1
#
## Windows PowerShell
### Winget's apps installation
#
winget install --id Git.Git -e --source winget;
if ($?) { winget install --id Microsoft.VCRedist.2015+.x64 -e --source winget };
if ($?) { winget install --id Skillbrains.Lightshot -e --source winget };
if ($?) { winget install --id qBittorrent.qBittorrent -e --source winget };
if ($?) { winget install --id Google.Chrome -e --source winget };
if ($?) { winget install --id Neovim.Neovim -e --source winget }; # Neovim is a refactor, and sometimes redactor, in the tradition of Vim
if ($?) { winget install --id 7zip.7zip -e --source winget };
if ($?) { winget install --id DEVCOM.JetBrainsMonoNerdFont -e --source winget };
if ($?) { winget install --id Mozilla.Thunderbird -e --source winget };
if ($?) { winget install --id gerardog.gsudo -e --source winget }; # sudo for Powershell
if ($?) { winget install --id ALCPU.CoreTemp --source winget }; # Program to monitor processor temperature and other vital information
if ($?) { winget install --id FxSound.FxSound --source winget }; # Equalizer for Windows
if ($?) { winget install --id Bitwarden.Bitwarden -e --source winget --scope user };
if ($?) { winget install --id Telegram.TelegramDesktop -e --source winget --scope user };
if ($?) { winget install --id Microsoft.VisualStudioCode -e --source winget --scope user };
if ($?) { winget install --id Obsidian.Obsidian -e --source winget --scope user };
if ($?) { winget install --id Yandex.Browser -e --source winget --scope user };
И выполните скрипт PowerShell:
.\PowerShellInstall_Winget_Machine.ps1
Включение Hyper-V
Шаг №4.
Для работы мне нужен гипервизор, так как в Windows уже есть свой - его я и использую. Для включения необходимо запустить PowerShell от имени Администратора (только для включения модуля) и выполнить команду:
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V -All
И остался заключительный пятый шаг - настройка самого PowerShell для удобства работы с ним.
Настройка PowerShell
Установка модулей PowerShell
Создайте скрипт с необходимыми модулями:
notepad.exe .\PowerShellInstall_Modules.ps1
#
## Windows PowerShell
### PowerShell modules installation
#
Install-Module -Name posh-git -Scope CurrentUser; # для работы с Git
if ($?) { Install-Module -Name z -Scope CurrentUser }; # Для быстрого перемещения по папкам
if ($?) { Install-Module -Name PSReadLine -Scope CurrentUser }; # Настройка промпта PowerShell
if ($?) { Install-Module -Name Terminal-Icons -Scope CurrentUser }; # Отображения иконок в темирнале с помощью Nerd Font (в моем случает JeBrainsMonoNerdFont)
Выполните скрипт:
.\PowerShellInstall_Modules.ps1
Настройка темы для PowerShell
Я использую отредактированную тему "One Half Dark Edited", для того, чтобы применить ее, откройте настройки PowerShell через json-файл и внутри брекетов в разделе "schemes" вставьте данный блок (если вам интересно, что за тема):
{
"background": "#2C2845",
"black": "#5E5D5D",
"blue": "#61AFEF",
"brightBlack": "#757575",
"brightBlue": "#61AFEF",
"brightCyan": "#56B6C2",
"brightGreen": "#98C379",
"brightPurple": "#C678DD",
"brightRed": "#E06C75",
"brightWhite": "#DCDFE4",
"brightYellow": "#FFFD58",
"cursorColor": "#0CFF93",
"cyan": "#56B6C2",
"foreground": "#FCFCFC",
"green": "#98C379",
"name": "One Half Dark Edited",
"purple": "#C678DD",
"red": "#E06C75",
"selectionBackground": "#FFFFFF",
"white": "#DCDFE4",
"yellow": "#E5E34F"
}
Создание и настройка профиля PowerShell
Есть несколько типов профилей для PowerShell:
Current User, Current Host -
$PROFILECurrent User, Current Host -
$PROFILE.CurrentUserCurrentHostCurrent User, All Hosts -
$PROFILE.CurrentUserAllHostsAll Users, Current Host -
$PROFILE.AllUsersCurrentHostAll Users, All Hosts -
$PROFILE.AllUsersAllHosts
Как правило, я использую $PROFILE. Для его создания нужно выполнить команду:
if (!(Test-Path -Path $PROFILE)) {
New-Item -ItemType File -Path $PROFILE -Force
}
Теперь можно перейти к настройкам самого профиля.
Вот мой текущий:
notepad.exe $PROFILE
#
## Windows PowerShell
### PowerShell User Profile
#
### Alias
Set-Alias -Name vim -Value $env:ProgramFiles\Neovim\bin\nvim.exe
Set-Alias -Name cle -Value Clear-Host
Set-Alias -Name ll -Value Get-ChildItem
Set-Alias -Name cln -Value CleanTemp
Set-Alias -Name touch -Value New-Item
Set-Alias -Name sudo -Value $env:LOCALAPPDATA\Microsoft\WinGet\Packages\gerardog.gsudo_Microsoft.Winget.Source_8wekyb3d8bbwe\x64\gsudo.exe
Set-Alias -Name ua -Value UpdateAll
Set-Alias -Name gst -Value GitStatus
Set-Alias -Name gsh -Value GitPush
Set-Alias -Name gll -Value GitPull
Set-Alias -Name hosts -Value ChangeHosts
Set-Alias -Name pubkey -Value SSHPubkey
### Functions
Function SSHPubkey {
Get-Content $env:USERPROFILE\.ssh\id_rsa.pub | ssh $(Read-Host -Prompt 'Enter user@ip-address') 'cat >> $HOME/.ssh/authorized_keys'
}
Function ChangeHosts {
sudo nvim $env:SystemRoot\System32\drivers\etc\hosts
}
Function GitPull {
git.exe pull; if ($?) { Clear-Host }
}
Function GitStatus {
git.exe status
}
Function CleanTemp {
Remove-Item -Path $env:TEMP\* -Recurse -ErrorAction SilentlyContinue
}
Function Which ($command) {
Get-Command -Name $command -ErrorAction SilentlyContinue |
Select-Object -ExpandProperty Path -ErrorAction SilentlyContinue
}
Function UpdateAll {
winget.exe upgrade --recurse --source winget --verbose
}
Function GitPush {
git.exe add .; if ($?) { git.exe commit -am "." }; if ($?) { git.exe push }; if ($?) { Clear-Host }
}
### Import-Module
Import-Module -Name PSReadLine
Import-Module -Name z
Import-Module -Name Terminal-Icons
Import-Module -Name posh-git
### Setup PSReadLineOption
Set-PSReadLineOption -EditMode Emacs
Set-PSReadLineOption -PredictionSource HistoryAndPlugin
Set-PSReadLineOption -PredictionViewStyle ListView
Set-PSReadLineOption -HistoryNoDuplicates:$True
Set-PSReadLineOption -ShowToolTips:$True
# Get KeyHandlers 'Get-PSReadLineKeyHandler -Bound -Unbound'
Set-PSReadlineKeyHandler -Chord 'Ctrl+d' -Function DeleteChar
Set-PSReadLineKeyHandler -Chord 'Ctrl+f' -Function ForwardWord
Set-PSReadLineKeyHandler -Chord 'Enter' -Function ValidateAndAcceptLine
На данный момент мне этого достаточно для повседневного использования. Периодически я добавляю полезные alias. Какое-то время использовал темы для PowerShell от Oh my posh, но в итоге вернулся к стандартному интерфейсу.
Комментарии (19)

sundmoon
17.12.2024 14:20Ещё мастхэв:
voidtools.Everything - моментальный поисковик по NTFS и ReFSNilesoft.Shell - удобоприемлемое контекстное меню проводника.
M2Team.NanaZip - форк 7zip, но удобнееMartiCliment.UniGetUI - оболочка для winget и прочих пакетных менеджеров.

fronik
17.12.2024 14:20За Nilesoft.Shell отдельный Вам плюсик. Очень интересная и красивая штука, попробую.

Armann
17.12.2024 14:20Установите минимальное значение InterfaceMetric для вашего текущего подключенияНебольшое пояснение не помешало бы :)

ialobanov Автор
17.12.2024 14:20-InterfaceMetric- Указывает метрику для IP-интерфейса. При выборе маршрутов для определения приоритета используется общая метрика, которая является суммой метрики маршрута и метрики интерфейса. Обычно метрика интерфейса отдает предпочтение определенному интерфейсу, например, использованию проводного соединения, если доступны как проводное, так и беспроводное соединение. Значение этого параметра по умолчанию использует значение, сгенерированное AutomaticMetric. Если значение этого параметра установлено, то параметр AutomaticMetric автоматически отключается.
Чем ниже значение, тем выше приоритет интерфейса.
Armann
17.12.2024 14:20Спасибо, но определение я сам умею найти.
Но зачем вы устанавливаете метрику для свежеустановленной винды? Что это дает? Какие проблемы решает?

ialobanov Автор
17.12.2024 14:20Это дает приоритет на другими подключениями, в том числе ВПН, когда они появятся, то есть быстрее будет отклик в браузере, например. Для некоторых ВПН я увеличил метрику и прописал адреса в
hosts, соответственно такие ВПН-подключения никак не виляют на основное. Возможно есть более качественное решения, но я его пока не нашел.

haired
17.12.2024 14:20Первое действие ради действия. У вас 328 разных сетевых интерфейсов? Проверять их статус через PWS, или просто скосить глаза в правый нижний угол и увидеть поднялся там интерфейс, или нет? Потому что все дальнейшие действия смысла не имеют, если интерфейс лежит. А если не лежит — то не имеют в двойне, оно и без настроек метрики работает.

ialobanov Автор
17.12.2024 14:20Конечно, действие имеет смысл, если сетевой интерфейс активен. Чтобы изменить метрику интерфейса, нужно узнать его
-InterfaceIndexили-InterfaceAlias, что как раз можно сделать с помощью первой команды.

SignFinder
17.12.2024 14:20А можно установить WSL и иметь нативную консоль в том же Windows Terminal с нативными vim, git, docker etc.
И PowerShell Core / Powershell не форк, а развитие Windows Powershell,n начиная с 6 версии.

ialobanov Автор
17.12.2024 14:20WSL тоже использую, но в основном для VS Code и в целом не вижу никаких проблем использовать PowerShell для vim или git.
Задумался, что можно WSL поставить по умолчанию в терминале и настроить соответственно, возможно попробую.
Про fork сказано в официальном репозитории PowerShell:...Although this repository started as a fork of the Windows PowerShell codebase...

Evgenym
17.12.2024 14:20Посмотрите еще в сторону Powershell DSC https://learn.microsoft.com/en-us/powershell/dsc/overview?view=dsc-2.0 Для каких-то настроек будет достаточно описать желаемое состояние, а не писать скрипты для достижения этого состояния

Gordon01
17.12.2024 14:20О, класс, современная инструкция по настройке современного виндовса. Сам примерно те же инструменты использую.
Еще использую https://starship.rs/ для современного промпта в повершелле.

ialobanov Автор
17.12.2024 14:20https://starship.rs/ - пробовал, но мне хватает стандартного интерфейса
vilgeforce
Особенно Яндекс Браузер, да... Чего ж сразу не буткит-то?
ialobanov Автор
Можно же закомментировать, если вы опасаетесь Яндекса
ialobanov Автор
И кстати Яндекс браузер устанавливается в пространство текущего пользователя, в AppData