<# .SYNOPSIS Запуск pg-stand-sync: находит интерпретатор, чинит кодировку консоли, пробрасывает аргументы. .EXAMPLE .\run.ps1 # пульт (TUI) .\run.ps1 list # базы на стенде .\run.ps1 --dry-run sync zpas # проверка команд без выполнения .\run.ps1 -Setup # создать .venv и поставить зависимости .\run.ps1 -Tests # прогнать тесты #> [CmdletBinding()] param( # Создать .venv и установить requirements.txt [switch]$Setup, # Прогнать tests_tui.py вместо запуска приложения [switch]$Tests, # Всё остальное уходит в pg_stand_sync.py как есть [Parameter(ValueFromRemainingArguments = $true)] [string[]]$Rest ) $ErrorActionPreference = 'Stop' $root = $PSScriptRoot $venvPython = Join-Path $root '.venv\Scripts\python.exe' # Русский лог и рамки Textual в cp866-консоли превращаются в мусор [Console]::OutputEncoding = [Text.Encoding]::UTF8 [Console]::InputEncoding = [Text.Encoding]::UTF8 $env:PYTHONIOENCODING = 'utf-8' function Find-Python { if (Test-Path $venvPython) { return $venvPython } foreach ($name in 'python', 'py') { $cmd = Get-Command $name -ErrorAction SilentlyContinue if ($cmd) { return $cmd.Source } } throw 'Python не найден: поставьте его или создайте окружение через .\run.ps1 -Setup' } if ($Setup) { if (-not (Test-Path $venvPython)) { $bootstrap = Find-Python Write-Host "создаю .venv ($bootstrap)" -ForegroundColor Cyan & $bootstrap -m venv (Join-Path $root '.venv') if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } } Write-Host 'ставлю зависимости' -ForegroundColor Cyan & $venvPython -m pip install --disable-pip-version-check -r (Join-Path $root 'requirements.txt') exit $LASTEXITCODE } $python = Find-Python if ($Tests) { & $python -m pytest (Join-Path $root 'tests_tui.py') -q @Rest exit $LASTEXITCODE } # Без textual приложение молча откатится в текстовое меню — предупредить, пока не поздно & $python -c 'import textual' 2>$null if ($LASTEXITCODE -ne 0) { Write-Host 'textual не установлен — откроется текстовый режим. Полный пульт: .\run.ps1 -Setup' ` -ForegroundColor Yellow } & $python (Join-Path $root 'pg_stand_sync.py') @Rest exit $LASTEXITCODE