◉CLAUDE LABEN
●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました●2.1.301 — vim の % モーション、VS Code パネルでの LaTeX 数式表示、使用量上限待ちのリトライ監視の上限が入りました(10/15)●2.1.299 — 200K トークン超で約54分放置した会話はアイドル圧縮。MCP の許可ルールは名指ししたサーバーだけに一致します●SONNET 4.5 — Claude API での提供終了は 11/30、残り45日。移行先は Sonnet 5.5●WINDOWS — 日本語の環境でだけフックが黙って壊れる報告があり、文字コードの確認が呼びかけられています●FAST MODE — Opus 5.5 の Fast mode がリサーチプレビューを終え、ベータヘッダーが不要になりました(10/15)●NEW — Cowork に渡したフォルダの先頭に、十行の約束ファイルを置いてみました
記事一覧/Claude Code
⟐ Claude Code/2026-04-21中級

Claude Code の Bash が Windows で詰まるときに — CLAUDE_CODE_USE_POWERSHELL_TOOL=1 の実用メモ

Windows で Claude Code を使っていると、Bash 経由のコマンドがときどき不自然に失敗します。環境変数 CLAUDE_CODE_USE_POWERSHELL_TOOL=1 を立てて PowerShell を直接叩くようにするだけで、症状の多くが消えます。この記事は、その切り替えを実際に使ってみた上で見えてきた注意点をまとめたものです。

claude-code132windowspowershelltroubleshooting61shell

Windows で Claude Code を使うと、たまに起きる不思議な失敗

Windows マシンで Claude Code を触っていて、こんな場面に遭遇したことはないでしょうか。

ファイルを開く・検索する・簡単なスクリプトを走らせるといった作業は普通に動くのに、あるタイミングでパスが壊れたり、Git コマンドがクオートの解釈で失敗したり、改行コードがらみで挙動が読めなくなります。それらを Claude Code 側から見ると、「Bash でこう書いた → エラー → 別の書き方を試す」を往復し始めて、出力がだんだん冗長になっていきます。

このタイプの不調の原因の多くは、Windows 上の Bash(Git Bash・MSYS2・WSL 風のラッパーなど)と、Claude Code が想定しているシェルの振る舞いが微妙にずれているところにあります。ここで役に立つのが CLAUDE_CODE_USE_POWERSHELL_TOOL=1 という環境変数です。これをセットした状態で Claude Code を起動すると、シェル経由のコマンドを PowerShell 側に直接渡すようになります。

この記事は、私がこの切り替えを業務で使ってみて得た、Windows ユーザーにとっての判断材料をまとめたものです。公式の機能説明を翻訳し直すのではなく、「いつ使うべきか」「使うと何が変わるか」「残る落とし穴は何か」という実務目線の話を中心に書きます。

そもそもこの環境変数は何をしているのか

Claude Code は内部で複数の「ツール」を切り替えながらコマンドを実行します。そのなかでシェル実行を担うのが Bash 系のツールです。既定では、POSIX シェル互換の挙動を前提にした実装になっていて、Linux や macOS ではそのまま素直に動きます。

Windows の場合、Claude Code を Git Bash などの POSIX エミュレーション上で動かすケースが多く、そこでは「パスのスラッシュが混ざる」「クオートの解釈が二重になる」「cmd と PowerShell のどちらが最終的に呼ばれるか環境で変わる」といったズレが発生しやすくなります。

CLAUDE_CODE_USE_POWERSHELL_TOOL=1 を立てると、シェル実行の経路を変更し、PowerShell を直接叩くようになります。PowerShell は Windows 11 にも標準で入っており、Windows 側のパスやユーザープロファイル、環境変数を最初から前提として動きます。結果として、Windows ならではの噛み合わなさがだいぶ減ります。

こういうときに効く

使って一番わかりやすく効くのは、以下のような場面です。

長いパスやスペースを含むパスを扱うとき

Windows は C:\Users\<名前>\OneDrive\Documents のような、スペースや日本語を含むパスが当たり前です。Git Bash 経由でここを渡すと、クオートを何重に書けばいいかで毎回つまずきます。PowerShell 直接実行だと、Windows 側のパス表記をそのまま渡せるので、このストレスがほとんど消えます。

ネットワーク関連・プロキシ越しのコマンド

企業 PC では HTTP プロキシや証明書周りの設定が Windows の資格情報マネージャーに寄っていることが多く、Bash 経由だと証明書の参照位置が合わずに SSL certificate problem のようなエラーが出ます。PowerShell 側だと Windows の証明書ストアをそのまま見にいくため、追加設定なしで通ることがあります。

PowerShell でしか使えない cmdlet を呼びたいとき

Get-Process、Get-Service、Get-AppxPackage のような cmdlet は PowerShell 固有のものです。Bash からは呼べませんが、PowerShell 経由なら自然に書けます。Windows 環境の診断を Claude Code 越しに行うときに便利です。

切り替えたときに注意すること

逆に、切り替えることで「従来の Bash 書きの慣習」がそのままでは使えなくなる部分もあります。

POSIX のパイプやリダイレクトの書き方

command1 | command2 のようなパイプは PowerShell でも動きますが、PowerShell のパイプはテキストではなく「オブジェクト」を流す設計です。grep の代わりに Select-String、awk の代わりに ForEach-Object のように、置き換えが必要になります。Claude Code は多くの場合この変換を自動で調整してくれますが、既存のシェルスクリプトをそのまま貼り付けるような使い方は相性が悪くなります。

実行ポリシー(Execution Policy)

PowerShell にはスクリプト実行を制限するポリシー設定があります。業務 PC で Restricted が適用されていると、Claude Code から .ps1 ファイルを走らせようとしたときに拒否されます。この場合、管理者権限で Set-ExecutionPolicy RemoteSigned -Scope CurrentUser を一度実行して、ユーザー単位で緩める必要があります。

クオート挙動の差

POSIX シェルと PowerShell はクオートの扱いが微妙に違います。とくに二重引用符の中での $ の展開ルールや、シングルクオートの扱いが違います。Claude Code が生成したコマンドの挙動を「確認せずに流す」運用をしていた人ほど、この差にハマりやすくなります。まずは短いコマンドで動作を見てから、長い処理に入るのが安全です。

切り替え方と解除の仕方

設定はシンプルです。新しいシェルを起動する前に環境変数を立てるだけで、Claude Code の次回起動から有効になります。

# PowerShell の場合(現在のセッションだけ)
$env:CLAUDE_CODE_USE_POWERSHELL_TOOL = "1"
claude
 
# 永続化したい場合(ユーザー環境変数に保存)
[Environment]::SetEnvironmentVariable("CLAUDE_CODE_USE_POWERSHELL_TOOL", "1", "User")

Git Bash 側で起動している場合は、.bashrc に export 行を足しておくと、Bash から claude を起動したときにも伝播します。

# ~/.bashrc
export CLAUDE_CODE_USE_POWERSHELL_TOOL=1

止めたくなったら、値を空に戻すか、ユーザー環境変数を削除します。

# 現在のセッションだけ
Remove-Item Env:CLAUDE_CODE_USE_POWERSHELL_TOOL
 
# ユーザー環境変数から削除
[Environment]::SetEnvironmentVariable("CLAUDE_CODE_USE_POWERSHELL_TOOL", $null, "User")

切り替えるかどうかの判断基準

ここまでを踏まえて、切り替えるかどうかの判断を迷う場面もあるはずです。私の経験則としては、次の条件のどれかに当てはまるなら試す価値があります。

一つ目は、Windows でしか作業しない日が多いこと。Git Bash と PowerShell の二段構えの複雑さを避けられるだけでも十分に価値があります。二つ目は、企業 PC で証明書・プロキシ・資格情報周りの制約が厳しいこと。三つ目は、扱うコードベースの多くが Windows 前提(.NET、PowerShell スクリプト、Windows API 利用など)であること。

逆に、普段から WSL の中で作業していて Claude Code も WSL 側で動いている人は、切り替えの恩恵がほぼありません。WSL はすでに Linux そのものなので、POSIX シェル互換の振る舞いで問題が起きにくいからです。

残る Windows 固有の詰まりどころ

環境変数を切り替えても、Windows ならではのトラブルがすべて消えるわけではありません。覚えておきたい残りのポイントをいくつかメモしておきます。

パスの長さ制限

Windows には既定で 260 文字のパス長制限があります。npm や Yarn のプロジェクトで node_modules が深くネストすると、この制限に引っかかります。Group Policy や LongPathsEnabled レジストリで解除できますが、Claude Code が関わる問題というより Windows 全体の話です。

改行コード

Git を Windows で使うと、core.autocrlf の設定によってチェックアウト時に改行が勝手に変換されます。これは Claude Code が関与する前の問題ですが、.gitattributes を設定していない状態で、生成されたコマンドの挙動が予想外に見えることがあります。新しいリポジトリでは .gitattributes に * text=auto eol=lf のような基本行を入れておくと、この手の混乱を未然に防げます。

管理者権限が必要なコマンド

netsh、sfc、Stop-Service のような管理者権限が必要な操作は、Claude Code からはそのままでは走りません。Claude Code 自体を管理者権限で起動している必要があります。権限昇格のプロンプトが常に必要な業務 PC だと、このあたりは手動操作の出番になります。

切り替え後のふるまいを確認する簡単な方法

CLAUDE_CODE_USE_POWERSHELL_TOOL=1 を立てたあと、実際に PowerShell が使われているかを確認したくなります。簡単な確認としては、以下のような Windows 固有コマンドを Claude Code に実行させてみることです。

$PSVersionTable
Get-Location
[System.Environment]::OSVersion

これらが素直に結果を返すようになっていれば、切り替えが効いています。Bash 経由のままだと「command not found」相当のエラーになることが多いので、違いが分かりやすいはずです。


Windows で Claude Code を使っていて「なんとなく噛み合わない」感覚がある人は、一度この環境変数を立ててみる価値があります。合わなければ戻せばいいだけなので、失う時間もわずかです。私自身、Windows と macOS を行き来する開発環境では、Windows マシンだけ常時この設定を有効にしています。環境ごとに最適な構成は違うものの、それを明示的に選べるようにしておくこと自体が、長期的にはコード生成の品質を一段階引き上げてくれます。

シェア

お読みいただきありがとうございます

Claude Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

⟐ Claude Code2026-05-24
Claude Code で連続する Edit が連鎖的に失敗するときの直し方 — old_string が消える・重複する問題
Claude Code が同じファイルへ Edit を連続で投げると、2件目以降が突然『not found』や『not unique』で落ちることがあります。原因は順序依存とコンテキスト二重化で、Read 再実行と分割パッチで救えます。
⟐ Claude Code2026-05-10
Claude Code の Glob と Grep が0件を返すときの原因切り分け
Claude Code の Glob/Grep ツールがファイルを見つけられないとき、.gitignore除外・隠しファイル・パターン記法の落とし穴を切り分け、適切な代替手段で確実に発見する手順をまとめます。
⟐ Claude Code2026-05-10
Claude Code の Read が大きなファイルを最後まで読まないとき — PARTIAL view の受け取り方と offset / limit の設計
Read が大きなファイルを途中までしか返さないとき、Claude Code は PARTIAL view の通知を出しています。通知の受け取り方と、行数ではなくバイト予算で offset / limit を決める方法を、実測値とともにお伝えします。