PowerShell 7.6.6が起動直後に落ちる原因と対処法:totalWidth (‘-10’)エラー

対象: PowerShell 7.6.6、日本語などのローカライズ環境
主なエラー: totalWidth ('-10') must be a non-negative value
症状: pwshを起動しても、プロンプトが表示される前に1~2秒で終了する

この症状は、PowerShellが起動時に表示する更新通知の不具合で発生します。急いで復旧したい場合は、先に次の回避策を試してください。

対処法:更新通知をオフにしてWindowsを再起動する

pwshが起動しない場合は、スタートメニューから「Windows PowerShell」を開き、次のコマンドを実行します。

[Environment]::SetEnvironmentVariable(
    'POWERSHELL_UPDATECHECK',
    'Off',
    'User'
)

実行後、Windowsを再起動してください。筆者の環境では、Claudeデスクトップアプリを終了しただけでは復旧せず、Windowsの再起動後にpwshが正常に起動することを確認しました。

コマンドプロンプトから一時的に起動する場合

設定を永続化せず、そのコマンドプロンプト内だけでpwshを起動するには、次を実行します。

set POWERSHELL_UPDATECHECK=Off
pwsh

この設定は、コマンドプロンプトを閉じると失われます。永続化したい場合は、代わりに次を実行してからWindowsを再起動します。

setx POWERSHELL_UPDATECHECK Off

値にはOffを指定してください。PowerShell本家のIssueでは、LTSではこの問題を回避できないと報告されています。

更新通知をオフにしても、PowerShellを更新できなくなるわけではありません。通知が表示されなくなるだけなので、更新の有無は必要に応じて自分で確認します。

winget list --id Microsoft.PowerShell --upgrade-available

発生した症状

筆者の環境では、2026-10-20 お昼ごろに問題が発生しました。

  • Windows 11 Pro 10.0.26200、日本語UI
  • PowerShell 7.6.6
  • MSI版をC:\Program Files\PowerShell\7\へインストール
  • PowerShell同梱の.NET 10.0.12
  • profile.ps1系の4つのプロファイルはいずれも存在しない

ClaudeデスクトップアプリのCodeタブからターミナルを開くと、pwshが1~2秒で終了しました。開き直しても同じです。

ログには、次の終了コードが残っていました。セッションを識別できる情報は省略しています。

Shell PTY for session ... exited with code -2146232797

-2146232797を符号なし32ビット整数として16進数に直すと、0x80131623です。これは.NETのCOR_E_FAILFASTに対応し、Environment.FailFast()によってプロセスが強制終了した可能性を示します。

原因はローカライズされた更新通知

更新通知を表示するUpdatesNotification.ShowUpdateNotification()は、通知文の1行目が最も長いことを前提にしています。そのうえで、1行目と後続行の文字数の差から余白を計算し、String.PadRight()へ渡しています。

ところが、日本語などの翻訳では後ろの行のほうが長くなる場合があります。その結果、PadRight()へ負の値が渡されます。

totalWidth ('-10') must be a non-negative value. (Parameter 'totalWidth')

この例外がPowerShellの起動処理内で捕捉されないため、単なる表示崩れでは終わらず、Environment.FailFast()によってpwsh全体が終了します。

PowerShell本家のIssue #28131では、PowerShell 7.6.6に含まれる13言語を調べた結果、チェコ語、ドイツ語、フランス語、イタリア語、日本語、韓国語、ロシア語、中国語(簡体字)、中国語(繁体字)の9言語で余白の計算結果が負になったと報告されています。

また、文字列の長さを画面上の表示幅ではなく文字数で数えているため、全角文字を含む言語では、クラッシュしない場合でも枠の位置がずれる可能性があります。

ターミナルの横幅は原因ではなかった

調査当初は、ログに残っていたcols=72やcols=80という値から、サイドパネルが狭いため枠線の計算結果が負になったのではないかと考えました。

しかし、同じ問題はWindows Terminalでも発生しました。実際の入力値はターミナルの幅ではなく、ローカライズされた通知文の各行の長さでした。

スタックトレースから「どこで落ちたか」は分かっても、「問題の入力がどこから来たか」までは分かりません。既存のIssueと照合することで、最初の推測を修正できました。

なぜ突然起きたのか

ここからは、公開情報と発生時刻をもとにした推測です。

PowerShellの更新通知は、新しいバージョンがある場合にだけ表示されます。また、PowerShell 7.6.1以降では、新しいリリースの公開から7日間は通知を表示しない仕様になっています。

PowerShell 7.6.7は2026-10-13に公開されました。その7日後にあたる2026-10-20から、7.6.6で7.6.7の通知が表示対象になったため、不具合が表面化したと考えられます。

つまり、PowerShellやターミナルの設定を直前に変更していなくても、更新通知が表示される日になったことで突然起動しなくなる可能性があります。翻訳された更新通知は7.6.6から含まれるようになったと、Issueのコメントで報告されています。

イベントログで落ちた場所を確認する

アプリ側のログだけでは原因が分からない場合は、Windowsのイベントログを確認します。Windows PowerShell 5.1から、次のコマンドを実行しました。

Get-WinEvent -FilterHashtable @{
    LogName  = 'Application'
    StartTime = (Get-Date).AddHours(-3)
} |
    Where-Object ProviderName -eq '.NET Runtime' |
    Select-Object -First 1 -ExpandProperty Message

アプリケーションログのソース.NET Runtime、イベントID1025に、次の内容が記録されていました。

Application: pwsh.exe
CoreCLR Version: 10.0.1226.41902
.NET Version: 10.0.12
Description: The application requested process termination through System.Environment.FailFast.
Message: totalWidth ('-10') must be a non-negative value. (Parameter 'totalWidth')
   at System.String.PadRight(Int32 totalWidth, Char paddingChar)
   at Microsoft.PowerShell.UpdatesNotification.ShowUpdateNotification(PSHostUserInterface hostUI)
   at Microsoft.PowerShell.ConsoleHost.Start(...)

注目すべき箇所は、System.String.PadRight()とMicrosoft.PowerShell.UpdatesNotification.ShowUpdateNotification()です。これにより、文字列の余白を作る処理が、起動時の更新通知から呼ばれて失敗したと判断できます。

7.6.7へ更新すれば直るのか

2026-10-20時点では、回避策として7.6.7への更新だけに頼ることはおすすめできません。

7.6.7へ更新すると、その時点では「7.6.7より新しいバージョン」の通知が出ないため、直ったように見える可能性があります。しかし、Issueと修正PR #28236によると、7.6.7にも問題の計算処理が残っています。

将来7.6.7より新しいバージョンが公開され、更新通知の表示時期になると再発する可能性があります。修正PRは提出されていますが、2026-10-20時点ではOpenで、修正を含む正式リリースは確認できません。

wingetでインストール形式が異なると表示された場合

筆者の環境では、次のコマンドによる更新が失敗しました。

winget upgrade --id Microsoft.PowerShell
新しいバージョンが見つかりましたが、インストールテクノロジが
現在インストールされているバージョンと異なります。
パッケージをアンインストールして、新しいバージョンをインストールしてください。

既存環境はMSI版でした。一方、PowerShell 7.6.0以降、wingetは既定でMSIX版を選択します。7.6.7のwingetマニフェストにはMSIX版とMSI版の両方がありますが、既定の選択と現在のインストール形式が一致しない場合があります。

入れ直す場合は、pwshではなくWindows PowerShell 5.1またはコマンドプロンプトから実行します。MSIX版へ切り替える場合は、次のようになります。

winget uninstall --id Microsoft.PowerShell
winget install --id Microsoft.PowerShell --source winget

MSI版を維持する場合は、インストーラー形式としてwixを指定できます。

winget install --id Microsoft.PowerShell --source winget --installer-type wix

参考リンク

コメントを送信