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

- リンク: https://catstudio.sakura.ne.jp/cms001/?p=676
- 公開日: 2026-10-20T14:16:00+09:00
- 作成者: Editor T

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

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

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

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

    ```wp-block-code
    [Environment]::SetEnvironmentVariable(
        'POWERSHELL_UPDATECHECK',
        'Off',
        'User'
    )
    ```

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

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

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

    ```wp-block-code
    set POWERSHELL_UPDATECHECK=Off
    pwsh
    ```

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

    ```wp-block-code
    setx POWERSHELL_UPDATECHECK Off
    ```

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

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

    ```wp-block-code
    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秒で終了しま
した。開き直しても同じです。

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

    ```wp-block-code
    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()`へ負の値が渡されます。

    ```wp-block-code
    totalWidth ('-10') must be a non-negative value. (Parameter 'totalWidth')
    ```

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

[PowerShell本家のIssue #28131](https://github.com/PowerShell/PowerShell/issues/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に公開](https://github.com/PowerShell/PowerShell/releases/tag/v7.6.7)
されました。その7日後にあたる2026-10-20から、7.6.6で7.6.7の通知が表示対象になった
ため、不具合が表面化したと考えられます。

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

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

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

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

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

    ```wp-block-code
    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](https://github.com/PowerShell/PowerShell/pull/28236)
によると、7.6.7にも問題の計算処理が残っています。

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

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

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

    ```wp-block-code
    winget upgrade --id Microsoft.PowerShell
    ```

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

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

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

    ```wp-block-code
    winget uninstall --id Microsoft.PowerShell
    winget install --id Microsoft.PowerShell --source winget
    ```

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

    ```wp-block-code
    winget install --id Microsoft.PowerShell --source winget --installer-type wix
    ```

## 参考リンク

 * [PowerShell Issue #28131：ローカライズされた更新通知で起動時にクラッシュする問題](https://github.com/PowerShell/PowerShell/issues/28131)
 * [PowerShell Pull Request #28236：更新通知の余白計算を修正するPR](https://github.com/PowerShell/PowerShell/pull/28236)
 * [PowerShell 7.6.6が起動できない問題についての日本語記事](https://note.com/rapid_phlox5979/n/n712aa54e9d26)
 * [Microsoft Learn：PowerShellの更新通知について](https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_update_notifications)
