Windows: ollama pull ронял скрипт в PowerShell 5.1

При $ErrorActionPreference = Stop любая строка stderr внешней программы,
перенаправленная в $null, становится ошибкой NativeCommandError. Ollama
пишет прогресс pulling manifest в stderr, скрипт падал на первой модели.

Внешние команды теперь идут через Invoke-Quiet: локальная мягкая политика
ошибок, наружу только код возврата. Ошибка ollama cp тоже не молчит.
This commit is contained in:
2026-09-11 20:53:23 +03:00
parent ee06a11172
commit cd80888018
+18 -3
View File
@@ -49,6 +49,20 @@ function Read-Json($path) {
try { Get-Content $path -Raw -Encoding UTF8 | ConvertFrom-Json } catch { $null } try { Get-Content $path -Raw -Encoding UTF8 | ConvertFrom-Json } catch { $null }
} }
# Windows PowerShell 5.1 при $ErrorActionPreference = "Stop" превращает любую
# строку stderr внешней программы в ошибку, если поток перенаправлен в $null.
# Ollama пишет прогресс "pulling manifest" именно в stderr, и первая же строка
# роняла скрипт. Поэтому внешние команды зовём через эту обёртку: внутри неё
# своя, мягкая политика ошибок, наружу уходит только код возврата.
function Invoke-Quiet {
$ErrorActionPreference = "SilentlyContinue"
$exe = $args[0]
$rest = @()
if ($args.Count -gt 1) { $rest = @($args[1..($args.Count - 1)]) }
& $exe @rest 2>&1 | Out-Null
return $LASTEXITCODE
}
# ---------- Где приложение и где его данные ---------- # ---------- Где приложение и где его данные ----------
# Сборок две, и ведут они себя по-разному. # Сборок две, и ведут они себя по-разному.
# · Классическая (Squirrel): %LOCALAPPDATA%\AnthropicClaude\app-<версия>\claude.exe, # · Классическая (Squirrel): %LOCALAPPDATA%\AnthropicClaude\app-<версия>\claude.exe,
@@ -362,8 +376,8 @@ if ($brain -eq "ollama" -or $brain -eq "both") {
@("nemotron-3-super:cloud", "claude-3-5-haiku", "optional") @("nemotron-3-super:cloud", "claude-3-5-haiku", "optional")
) )
foreach ($p in $pairs) { foreach ($p in $pairs) {
& ollama pull $p[0] 2>$null | Out-Null $rc = Invoke-Quiet ollama pull $p[0]
if ($LASTEXITCODE -ne 0) { if ($rc -ne 0) {
if ($p[2] -eq "optional") { if ($p[2] -eq "optional") {
Warn "$($p[0]) недоступна на твоём тарифе Ollama, пропускаю (нужен Pro или Max)." Warn "$($p[0]) недоступна на твоём тарифе Ollama, пропускаю (нужен Pro или Max)."
continue continue
@@ -372,7 +386,8 @@ if ($brain -eq "ollama" -or $brain -eq "both") {
Write-Host " Открой окно Ollama (иконка ламы) -> Sign in, затем запусти команду снова." Write-Host " Открой окно Ollama (иконка ламы) -> Sign in, затем запусти команду снова."
return return
} }
& ollama cp $p[0] $p[1] | Out-Null $rc = Invoke-Quiet ollama cp $p[0] $p[1]
if ($rc -ne 0) { Warn "Не смог создать псевдоним $($p[1]) для $($p[0])."; continue }
Ok "$($p[1]) -> $($p[0])" Ok "$($p[1]) -> $($p[0])"
} }
} else { } else {