Хочу поделиться с вами простыми шагами по настройке 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 -
$PROFILE
Current User, Current Host -
$PROFILE.CurrentUserCurrentHost
Current User, All Hosts -
$PROFILE.CurrentUserAllHosts
All Users, Current Host -
$PROFILE.AllUsersCurrentHost
All 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