ユーザー入力の受け取り

にメンテナンス済み

バッチファイルを実行している途中で、「ユーザー名を入力してもらいたい」「処理する対象のフォルダ名を聞きたい」といった場面があります。

コマンドプロンプト・バッチファイルでキーボードから文字列を受け取るには、set /pを使用します。ここでは、基本的な使い方から、未入力のチェックや入力のやり直しといった実用的な書き方までを紹介します。

set /pの基本的な使い方

set /pは、以下の形式で記述します。

set /p 変数名=表示するメッセージ

メッセージを表示した後、ユーザーが入力して Enter を押すと、入力した文字列が指定した変数に格納されます。

input.cmd
@echo off
setlocal

set /p name=お名前を入力してください:
echo こんにちは、%name%さん

endlocal
pause

実行すると、以下のように入力待ちの状態になります。

- □ ×
コマンド プロンプトのアイコン
コマンド プロンプト
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>input.cmd
お名前を入力してください:山田
こんにちは、山田さん
C:\users\user>

入力した文字列は、通常の変数と同じように%name%で参照できます。変数については、以下の記事を参照してください。

メッセージの末尾にスペースを入れる

=以降のメッセージはそのまま表示されます。末尾のスペースはエディタ上で見落としやすく、スペースがないと入力位置がメッセージにくっついてしまいます。

変数名とメッセージ全体を二重引用符で囲むと、スペースの有無が見た目にも明確になります。

set /p "name=お名前を入力してください: "

引用符自体は表示されません。以降のサンプルでは、この書き方で統一します。

未入力(Enter だけ)の判定

set /pを使うときに最も注意したいのが、何も入力せずに Enter だけを押した場合、変数は空になるのではなく、直前の値のまま変更されないという動作です。

@echo off
setlocal

set "name=未設定"
set /p "name=お名前を入力してください: "
echo [%name%]

endlocal
- □ ×
コマンド プロンプトのアイコン
コマンド プロンプト
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>input.cmd
お名前を入力してください:
[未設定]
C:\users\user>
おすすめ書籍※ 広告を含む場合があります
中小企業経営者のためのRPA入門 RPA導入を成功させる方法

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超入門

60分でわかる! AIエージェント 超入門

コマンドラインの黒い画面が怖いんです。

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門

この動作を利用して、「何も入力されなければ既定値を使う」処理を書くことができます。上記の例では、nameの初期値(未設定)が既定値として機能しています。

一方で、「未入力かどうか」を判定したい場合は、入力前に変数を空にしておく必要があります。変数が空であることは、if not definedで確認できます。

@echo off
setlocal

set "name="
set /p "name=お名前を入力してください: "

if not defined name (
  echo 名前が入力されていません。
  exit /b 1
)

echo こんにちは、%name%さん

endlocal

set "name="のように、=の右側を空にして変数を定義すると、その変数は削除されます。

入力前に変数を空にしておく

同じ名前の変数が環境変数としてすでに存在していると、Enter だけを押してもその値が残ります。判定が必要な場合は、set /pの前に必ずset "変数名="で空にしてください。

入力が正しいかをチェックする

Y/N の確認

実行前の確認として、yと入力されたときだけ処理を続ける例です。/iオプションを付けると、yとYを区別せずに比較できます。

@echo off
setlocal

set "answer="
set /p "answer=処理を実行しますか (y/n): "

if /i not "%answer%"=="y" (
  echo 中止しました。
  exit /b 1
)

echo 処理を実行します。

endlocal

ifコマンドの詳細は、以下の記事を参照してください。

1 文字のキー入力だけで選択させる場合は、choiceコマンドのほうが適しています。choiceは Enter が不要で、指定した文字以外は受け付けません。

数値かどうかをチェックする

set /aで計算する前などに、入力が数字だけで構成されているかを確認したい場合は、findstrの正規表現を利用します。

@echo off
setlocal

set "num="
set /p "num=数字を入力してください: "

echo %num%| findstr /r "^[0-9][0-9]*$" > nul
if errorlevel 1 (
  echo 数字以外が入力されました。
  exit /b 1
)

set /a result=num * 2
echo %num% の 2 倍は %result% です。

endlocal

echo %num%|の|の直前にスペースを入れないのは、スペースまでfindstrに渡される文字列に含まれてしまい、^[0-9][0-9]*$にマッチしなくなるためです。

このチェックは桁数や範囲は見ません。また、08のように先頭が0の数字はset /aで 8 進数として扱われ、エラーになる点にも注意してください。

なお、findstrはマッチしたときに0、しなかったときに1を終了コードとして返します。終了コードの判定については、以下の記事を参照してください。

正しい入力があるまで繰り返す

入力が正しくなかった場合に、エラーで終了するのではなくもう一度入力させたいときは、gotoでラベルに戻ります。

@echo off
setlocal

:INPUT
set "dir="
set /p "dir=対象のフォルダを入力してください: "

if not defined dir goto INPUT

if not exist "%dir%\" (
  echo "%dir%" というフォルダは存在しません。
  goto INPUT
)

echo "%dir%" を処理します。

endlocal

フォルダの存在確認には、末尾に\を付けたif exist "%dir%\"を使用しています。末尾に\がないと、同名のファイルが存在した場合にも真と判定されてしまいます。

入力に特殊文字が含まれる場合

set /p自体は、入力された文字列を変数にそのまま格納します。&や|が含まれていても、その時点では問題ありません。

問題になるのは、格納した値を%name%で展開したときです。%name%は行が解釈される前に展開されるため、値に&や|、>、<が含まれていると、それらがコマンドの区切りやリダイレクトとして扱われてしまいます。

このような入力を安全に扱うには、変数を二重引用符で囲むか、遅延環境変数展開を使用します。ただし、入力に"自体が含まれる場合は、引用符による保護は効きません。

@echo off
setlocal enabledelayedexpansion

set "text="
set /p "text=文字列を入力してください: "

echo !text!

endlocal

遅延環境変数展開(!text!)は、行の解釈が終わった後に値を展開するため、&などを含んでいても分解されません。ただし、!や^を含む文字列を、遅延展開を有効にしたまま別の変数やcallに渡すと壊れることがあります。完全に任意の文字列を扱いたい場合は、他の言語(PowerShell など)の利用も検討してください。

入力を画面に表示させない・改行しない

パスワードの入力

set /pで入力した文字列は、画面にそのまま表示されます。パスワードのように隠して入力させたい用途には向いておらず、バッチファイルだけで簡単に伏せ字にする方法もありません。

どうしても必要な場合は、PowerShell のRead-Host -AsSecureStringを利用するなど、別の手段を検討してください。パスワードをバッチファイルに平文で書くことも避けるのが望ましいです。

改行せずにメッセージだけ表示する

set /pは、入力を受け付けずにメッセージだけを表示するときにも利用されます。入力元にnulを指定すると、待機せずに改行なしでメッセージだけを出力できます。

<nul set /p "=処理中..."
echo 完了
- □ ×
コマンド プロンプトのアイコン
コマンド プロンプト
Microsoft Windows [Version xx.x.xxxxx.xxx]
(c) 2026 Ribbit App Development All rights reserved.
 
C:\users\user>sample.cmd
処理中…完了
C:\users\user>

echoは常に末尾で改行するため、同じ行に続けて表示したいときに役立ちます。

入力待ちで止まってしまう場合

set /pは、ユーザーの入力を待ち続けます。そのため、タスクスケジューラなど、人が操作しない環境で実行すると、入力待ちのまま処理が終わらなくなることがあります。

無人で実行される可能性があるバッチファイルでは、set /pの代わりに引数で値を受け取る形にしておくと、どちらの場合にも対応できます。

@echo off
setlocal

set "name=%~1"
if not defined name set /p "name=お名前を入力してください: "

echo こんにちは、%name%さん

endlocal

引数が渡された場合はそれを使用し、渡されなかった場合だけ入力を求めます。

入力をまとめて確認したいとき

入力項目が多い場合は、最後に入力内容を一覧表示して、yと入力されたときだけ処理を実行する流れにすると、入力ミスによる事故を減らせます。

練習問題

練習問題1

set /pで、何も入力せずに Enter だけを押した場合、変数はどうなるでしょうか?

回答がサーバーに送信されることはありません
練習問題2

Enter を押さなくても、yかnのどちらか 1 文字のキー入力だけで選択させたい場合に適しているのはどれでしょうか?

回答がサーバーに送信されることはありません
#コマンドプロンプト #バッチファイル #set #入力 #コマンド