質問するログイン新規登録

Q&A

1回答

398閲覧

バッチファイルの処理が落ちる原因がわからず解消できません。

makurosu7

総合スコア18

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

0グッド

1クリップ

投稿2025/11/20 14:12

編集2025/11/20 15:26

0

1

実現したいこと

ユーザー入力処理で最後まで処理を実行したい。

前提

ユーザー入力を2つ定義し、ひとつ目は年月日を/を使って入力する処理です。
1つ目は入力は出来はしますが、入力後にエンターを押すとバッチ処理が落ちてしまいます。
どうやって解決したらいいかわからない状態です。
どこをどう修正したら最後まで処理を実行できるか教えてもらえないでしょうか。

発生している問題・エラーメッセージ

最初のユーザー入力を実施したらバッチ処理が落ちる

該当のソースコード

@echo off
set /p data=今日の日付を入れて下さい (例:2025/11/20):

call set data=%data%

if /i "%data%"=="2025/11/20" (
echo 今日は2025/11/20です。
set /p nanana=続行しますか? (y/n):
set nanana=%nanana%
if /i "%nanana%"=="Y" (
echo Yが入力されました。
) else (
echo Nが入力されました。
)
) else (
echo 日付が合致しません。
)
pause

試したこと

以下の2つを””で囲う
・今日の日付を入れて下さい (例:2025/11/20):
・続行しますか? (y/n):

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

meg_

2025/11/20 16:44

タグが「Windows 10」ですがWindows 10を使用しているということでしょうか?
jimbe

2025/11/20 17:43 編集

コードのご提示には『コードのマークダウン』をご利用ください。 普通の文章のように書かれますと、一部の記号等が文字修飾のマークダウン等と解釈されて消えたりする可能性があります。 >バッチ処理が落ちてしまいます。 具体的にどのようになるのでしょうか。 スクリーンショットでご提示戴けますか? >@echo off を消して動かしたらどのような表示・結果になりますか? >call set data=%data% 最初の call は要りますか? そもそもこの行(と後の set nanana=%nanana% )は必要でしょうか
dodox86

2025/11/21 05:16

「バッチファイル」のタグはちゃんと独立して存在しています。適切なタグを付けないと、それで表示をフィルタリングしている回答者さんらに届きませんよ。
guest

回答1

0

行番号とインデントをつけるために、コピペしました。

BAT

1@echo off 2set /p data=今日の日付を入れて下さい (例:2025/11/20): 3 4call set data=%data% 5 6if /i "%data%"=="2025/11/20" ( 7 echo 今日は2025/11/20です。 8 set /p nanana=続行しますか? (y/n): 9 set nanana=%nanana% 10 if /i "%nanana%"=="Y" ( 11 echo Yが入力されました。 12 ) else ( 13 echo Nが入力されました。 14 ) 15) else ( 16 echo 日付が合致しません。 17) 18pause

6行目の(に対応する)ですが、おそらく15行目行頭の)のつもりなのでしょう。
しかし実際は、7行目以降に最初に出てきた)で、6行目の(は閉じてしまいます。()を二重引用符"で囲むなど引用(クォート)されている場合は除外)
それは、8行目の(y/n))です。で、そのあとの:が括弧の外なのでエラー。
( echo ABC ): の1行を実行してみると、同じく「: の使い方が誤っています。」というエラーになるかと思います。

対応としては、
案1:構文的な意味を持つ()を使わずに[y/n]などとする。
案2:クォート記号^を使って、(y/n^)として、)を「構文的な意味を持たない単なる文字列」とする。

他の言語でも、print("二重引用符というのは"という文字のことです")と書くと、2つ目の"が「閉じ引用符」とみなされてその次が構文エラーになりますが、そういうのと同じです。
案1:print('二重引用符というのは"という文字のことです')
案2:print("二重引用符というのは\"という文字のことです")


ただ、これを解決しても、駄目ですね。以下、上記の修正をした前提で続けると、
6行目から17行目までが、長いIF文で、この構文解析は6-17行目丸ごと一括で行われます。
10行目の%nanana%の変数展開(変数名から変数の値への置き換え)は、この構文解析時(構文解析直前)に行われますが、その時点では変数nananaはおそらく「空」なので、10行目は変数展開の結果if /i ""=="Y" (となり、そのあとで実行されるので、IF条件は常に偽です。

この間違いは、1行目の@echo offを削除して実行される文を画面表示すると、(注意深ければ)気づけます。

"%nanana%"の変数展開を正しくするには、
案1:括弧の中で代入した変数はそのあとの括弧内では参照しない
⇒ 処理を括弧の外に出してcallで呼ぶ
案2:「遅延環境変数」を使う
setlocal enabledelayedexpansionを冒頭に入れて、"!nanana!"!で参照する。ただし、他のバッチ処理と組み合わせて使うときはsetlocalの意味の理解が必要。

案2は、BATスクリプト内に単なる文字列の!の文字がなくて、変数の値にも!が含まれ得ないときは、単純修正で済みます。!が使われている場合はよく考える必要あり。
案1は修正が多いですが、括弧の中身が複雑な時は、括弧を使わず中身を全部サブルーチンにしてCALLで呼ぶほうがデバッグが楽になります。

あと、4行目と9行目は無意味なので削除しましょう。うまくいかず、試行錯誤途中で追加したのですかね?

このようにY/Nを聞くだけなら、choiceを使うという案3もあります。

BAT

1 choice /M 続行しますか 2 if errorlevel 2 ( 3 echo Nが入力されました。 4 ) else ( 5 echo Yが入力されました。 6 )

使い方は、choice /?に書いてあります。Yだとerrorlevel1で、Nだとerrorlevel2
if %errorlevel% == 1は前述の理由で括弧内に書くと意図しない結果になるので、%での変数展開をしないためにif errorlevel 値の構文を使います。
if errorlevel 1は「errorlevel1ならば」ではなくて「errorlevel1以上ならば」なので、2を先にチェックしないといけない。

参考

バッチスクリプトのデバッグをするときは、
@echo offは書かない
・ExplorerからBATファイルダブルクリックで実行するのではなくて、コマンドプロンプトかPowerShell画面から、カレントディレクトリをBATファイルのある場所に移動してから、BATファイル名入力して実行する
(ダブルクリックでの実行時に画面が自動で閉じるのを防ごうとpauseを入れても、構文エラーだとpauseコマンドの記述が認識されて実行される前にエラーになり、構文エラーのメッセージは一瞬ですぐ消える)

投稿2025/11/25 10:54

編集2025/11/25 11:02
otn

総合スコア86482

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問