Шпаргалка PowerShell

Перевод распространённых Bash-команд

Bash PowerShell Замечание
pwd Get-Location Показывает текущую папку
ls -la Get-ChildItem -Force Ключи Bash не переносить
mkdir -p path New-Item -ItemType Directory -Force -Path 'path' Только для создания папок
cat file Get-Content -LiteralPath 'file' -Encoding UTF8 Возвращает строки
cat file целиком Get-Content -LiteralPath 'file' -Raw -Encoding UTF8 Возвращает одну строку
cp -r source target Copy-Item -LiteralPath 'source' -Destination 'target' -Recurse Проверить конечную структуру папок
export NAME=value $env:NAME = 'value' Только текущий процесс и его дочерние
which codex Get-Command codex Может вернуть ps1, cmd или exe
python3 python либо py -3 Сначала проверить версию
command1 && command2 отдельные строки и проверка $LASTEXITCODE && отсутствует в Windows PowerShell 5.1
./script.sh & '.\script.ps1' Сценарий требуется переписать под PowerShell

Не переносите chmod, sudo, /tmp, $VAR и Bash here-document в нативную PowerShell-сессию. WSL — отдельная среда; Linux-команды допустимы, когда явно выбран WSL.

Пути с пробелами и кириллицей

$projectPath = Join-Path (Get-Location).Path 'Учебный проект'
New-Item -ItemType Directory -Force -Path $projectPath | Out-Null
Get-ChildItem -LiteralPath $projectPath -Force

-LiteralPath не интерпретирует квадратные скобки как шаблон. Для запуска программы по пути с пробелами используйте оператор вызова &:

$pythonCommand = (Get-Command python -ErrorAction Stop).Source
& $pythonCommand --version
if ($LASTEXITCODE -ne 0) { throw 'Интерпретатор не запустился' }

UTF-8 без зависимости от версии PowerShell

В Windows PowerShell 5.1 и PowerShell 7 различаются кодировки вывода в файл по умолчанию. Для воспроизводимой записи текстового шаблона используйте .NET:

$templatePath = Join-Path (Get-Location).Path 'example.txt'
if (Test-Path -LiteralPath $templatePath) { throw 'Файл уже существует: выберите другое имя' }
$templateText = @'
Цель: проверить обработку пустого ввода.
Результат: воспроизведение и проверенный diff.
'@
$utf8NoBom = New-Object System.Text.UTF8Encoding($false)
[IO.File]::WriteAllText($templatePath, $templateText, $utf8NoBom)

Одинарный here-string сохраняет $skill-name и другие $... буквально. В двойном here-string PowerShell пытается подставить переменные. Не подставляйте секреты в команды или шаблоны.

Не маскируйте неуспех внешней программы

python -m unittest discover -s backend -p 'test_*.py'
if ($LASTEXITCODE -ne 0) { throw 'Тесты завершились с ошибкой' }

$ErrorActionPreference = 'Stop' полезен для cmdlet, но сам по себе не превращает любой ненулевой код внешнего процесса в исключение во всех поддерживаемых версиях PowerShell. После Git, Python и Codex проверяйте $LASTEXITCODE.

Разделяйте Windows и WSL

Одинаковый проект может иметь пути C:\... в Windows и /mnt/c/... в WSL. Windows-процесс использует Windows Python/Node/Git и Windows .codex; WSL по умолчанию использует домашнюю папку Linux. Наличие авторизации или пакета в одной среде не доказывает его наличие в другой. В этом учебнике общий каталог настроек между средами не настраивается.

Официальный источник: приложение на Windows.

← Оглавление