Хочу поделиться с вами простыми шагами по настройке Winodows после ее установки с помощью PowerShell. Все шаги я выполнял неоднократно на Windows 11, думаю, что ошибок с Windows 10 не должно возникнуть.

Настройки подключения к интернету по умолчанию

Первое, что полезно выполнить, если в процессе будут использоваться различные ВПН - это сделать подключение по умолчанию самым приоритетным.

  1. Проверьте какие подключения у вас доступны, с помощью Windows PowerShell, запущенного от имени Администратора:

Get-NetIPInterface -AddressFamily IPv4
  1. Установите минимальное значение InterfaceMetric для вашего текущего подключения:

Set-NetIPInterface -InterfaceIndex 19 -InterfaceMetric 5
  1. Перезагрузите сетевой интерфейс, метрику которому вы изменили:

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)


  1. vilgeforce
    17.12.2024 14:20

    Особенно Яндекс Браузер, да... Чего ж сразу не буткит-то?


    1. ialobanov Автор
      17.12.2024 14:20

      Можно же закомментировать, если вы опасаетесь Яндекса


      1. ialobanov Автор
        17.12.2024 14:20

        И кстати Яндекс браузер устанавливается в пространство текущего пользователя, в AppData


  1. sundmoon
    17.12.2024 14:20

    Ещё мастхэв:

    voidtools.Everything - моментальный поисковик по NTFS и ReFS

    Nilesoft.Shell - удобоприемлемое контекстное меню проводника.

    M2Team.NanaZip - форк 7zip, но удобнее

    MartiCliment.UniGetUI - оболочка для winget и прочих пакетных менеджеров.


    1. fronik
      17.12.2024 14:20

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


  1. Armann
    17.12.2024 14:20

    Установите минимальное значение InterfaceMetric для вашего текущего подключения

    Небольшое пояснение не помешало бы :)


    1. ialobanov Автор
      17.12.2024 14:20

      -InterfaceMetric - Указывает метрику для IP-интерфейса. При выборе маршрутов для определения приоритета используется общая метрика, которая является суммой метрики маршрута и метрики интерфейса. Обычно метрика интерфейса отдает предпочтение определенному интерфейсу, например, использованию проводного соединения, если доступны как проводное, так и беспроводное соединение. Значение этого параметра по умолчанию использует значение, сгенерированное AutomaticMetric. Если значение этого параметра установлено, то параметр AutomaticMetric автоматически отключается.

      Чем ниже значение, тем выше приоритет интерфейса.


      1. Armann
        17.12.2024 14:20

        Спасибо, но определение я сам умею найти.

        Но зачем вы устанавливаете метрику для свежеустановленной винды? Что это дает? Какие проблемы решает?


        1. ialobanov Автор
          17.12.2024 14:20

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


  1. haired
    17.12.2024 14:20

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


    1. ialobanov Автор
      17.12.2024 14:20

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


  1. SignFinder
    17.12.2024 14:20

    А можно установить WSL и иметь нативную консоль в том же Windows Terminal с нативными vim, git, docker etc.

    И PowerShell Core / Powershell не форк, а развитие Windows Powershell,n начиная с 6 версии.


    1. ialobanov Автор
      17.12.2024 14:20

      WSL тоже использую, но в основном для VS Code и в целом не вижу никаких проблем использовать PowerShell для vim или git.

      Задумался, что можно WSL поставить по умолчанию в терминале и настроить соответственно, возможно попробую.

      Про fork сказано в официальном репозитории PowerShell:

      ...Although this repository started as a fork of the Windows PowerShell codebase...



  1. ForsakeNinNight
    17.12.2024 14:20

    Спасибо, отличная статья.


    1. ialobanov Автор
      17.12.2024 14:20

      И вам спасибо.


  1. Evgenym
    17.12.2024 14:20

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


    1. ialobanov Автор
      17.12.2024 14:20

      Спасибо, ознакомлюсь.


  1. Gordon01
    17.12.2024 14:20

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

    Еще использую https://starship.rs/ для современного промпта в повершелле.


    1. ialobanov Автор
      17.12.2024 14:20

      https://starship.rs/ - пробовал, но мне хватает стандартного интерфейса