HOWTO · Batch

バッチファイルの変数から二重引用符を削除する

%~1、変数置換、FOR /F を使い分けて、Batch ファイルの変数から引用符を削除する方法を説明します。

このページの内容

Batch ファイルの引数には %~1、変数内のすべての二重引用符を削除するには %variable:"=%、外側の一組だけを削除するには FOR /F%~A を使います。これらは別の処理です。以下では set "name=value" の形式を使い、空白、特殊文字、空の値、遅延展開、括弧ブロック内の展開タイミングも説明します。

%~1 で Batch 引数の引用符を削除する

%0 から %9 は、Batch ファイル名と渡された引数を表します。空白を含むパスを一つの引数として渡すために引用符で囲んだ場合、チルダ修飾子は展開時に外側の引用符を削除します。

@echo off
set "input=%~1"
echo Input without surrounding quotes: [%input%]
remove-quotes.cmd "Report 2026.txt"
Input without surrounding quotes: [Report 2026.txt]

%~1 は Batch の引数専用であり、任意の環境変数を処理する構文ではありません。複数の引数には %~2%~3 を使います。内部に含まれる引用符は削除されません。

変数からすべての二重引用符を削除する

%variable:search=replacement% は値の中の文字列を置換します。空文字列で二重引用符を置換すると、外側だけでなくすべての引用符が削除されます。

@echo off
set "value="Hello World""
set "withoutQuotes=%value:"=%"
echo Value: [%value%]
echo Without quotes: [%withoutQuotes%]
Value: ["Hello World"]
Without quotes: [Hello World]

内部の引用符を残す必要がある場合、この方法は使わないでください。同じ置換構文で単語も変更できます。

@echo off
set "value=Hello World"
set "updated=%value:World=Batch%"
echo [%updated%]
[Hello Batch]

&|<>^ を含むデータはコマンド構文と混ざらないように扱います。引用した set は代入を整理しますが、信頼できない文字列を安全なコマンドコードには変換しません。

FOR /F で外側の引用符だけを削除する

内部の内容を保持したまま外側の一組だけを削除するには、FOR /F%~A を使います。Batch ファイルではループ変数を %%A、対話プロンプトでは %A と書きます。

@echo off
set "value="Hello World""
for /f "delims=" %%A in (%value%) do set "withoutOuter=%%~A"
echo Original: [%value%]
echo Without outer quotes: [%withoutOuter%]
Original: ["Hello World"]
Without outer quotes: [Hello World]

delims= は空白で行を分割しないための指定です。FOR /F には空行、区切り文字、特殊文字について独自の解析規則があります。

空の値は先に判定します。

@echo off
set "value="
set "withoutOuter="
if defined value for /f "delims=" %%A in (%value%) do set "withoutOuter=%%~A"
if not defined withoutOuter echo The value is empty
The value is empty

括弧ブロックの展開タイミング

cmd は行や括弧ブロックを解析する時点でパーセント変数を展開します。ブロック内で値を変更しても、後の %value% が以前の値のままになる場合があります。遅延展開はタイミングを変えますが、! を含むデータには別の制限があります。

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "value="Hello World""
set "withoutOuter="
for /f "delims=" %%A in (!value!) do set "withoutOuter=%%~A"
echo Without outer quotes: [!withoutOuter!]
endlocal
Without outer quotes: [Hello World]

遅延展開は必要な場合だけ有効にしてください。データ中の感嘆符が変更されることがあります。

引用符の削除が常に正しい修正とは限らない理由

引用符には、空白を含むパスをまとめる構文としての役割と、値そのものとしての役割があります。引数を受け取った境界で正規化すると、後から文字列を推測する必要が減ります。

@echo off
set "path=%~1"
if not defined path (
    echo A path argument is required.
    exit /b 1
)
echo Ready to process: [%path%]
Ready to process: [C:\Program Files\Tool]

引用符を削除してもパスの存在確認や入力値の検証にはなりません。delcopymove などに渡す前に値を検証してください。

方法を選択する

値の出所に応じて、引数には %~1、すべての引用符には %variable:"=%、外側の一組には FOR /F%~A を選びます。

制限とトラブルシューティング

引数には %~1、すべての引用符には %variable:"=%、外側の一組には FOR /F%~A を使います。対応しない引用符は不正な入力であり、すべてを削除しても問題を隠すだけです。Batch ファイルとプロンプトでは FOR 変数の表記が異なり、前者は %%A、後者は %A です。入力の境界に最も近い、限定された方法を選んでください。