質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.34%
バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

Q&A

解決済

2回答

231閲覧

バッチ処理でif文の条件に計算式を用いたい

assemble

総合スコア8

バッチファイル

バッチファイル(Batch File)は、Windowsのコマンドラインインタープリターによって複数のコマンドを実行させる事が出来るスクリプトファイルです。

0グッド

0クリップ

投稿2024/12/06 07:49

実現したいこと

バッチ処理でif文の条件で"%A%" equ "%B-1%"の右側のように変数の計算を書き込みたいです。
(イメージとして上記のように表現しています。)
非常に初歩的なご質問で申し訳ないのですが、ご教授いただければと思います。

発生している問題・分からないこと

ソースコードの実行でOKを表示させたいです。
if文の条件の中にB-1のような変数を用いた計算式を入れると、計算結果ではないものとして扱われてしまいます。どのようにしたら計算結果を比較に用いることができるでしょうか。
条件分岐としてB-2、B-3と続けていきたいため最初にB-1を別の変数に格納してからif文に書き込むことはできません。

最終的に実現したいコード
set /a A=1
set /a B=2

if "%A%" equ "%B%-1" (
echo No.1
) else if "%A%" equ "%B%-2" (
echo No.2
) else if "%A%" equ "%B%-3" (
echo No.3
)

該当のソースコード

bat

1setlacal enablededelayedexpansion 2 3set /a A=1 4set /a B=2 5 6if "%A%" equ "%B%-1" ( 7 echo OK 8) else ( 9 echo NG 10) 11 12pause

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

"%B%-1" のダブルクォーテーションの位置の変更や、setを付け加えるなどしてみましたがうまくいきませんでした。(1と2-1の文字列が比較されてしまっていることは理解しています)
調べてみたものの、そういったコードを書いているサイトも見つけることができませんでした。

補足

windows11にて作業を行っています。
また、こういった初歩的な躓きがかなり多く勉強不足であると感じるため、おすすめの入門サイト等をご存じでしたら教えていただきたいです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

バッチスクリプトで数値演算(加減乗除など)が出来るのは、set /a コマンドだけなので(注1)、演算結果を変数に置くのが普通です。

(注1) for /Lで等差数列を作れますので、「等差数列の作成も数値演算の一種だ」とするなら、これも数値演算でしょうが、今回は使えないでしょうね。

AとBの差を求めてNo. 差と表示するだけなら、ダイレクトにそうすれば良いので、実際はIFの中味はそれぞれ全く異なる処理なのでしょうね。

CMD

1set /A B1=B-1, B2=B-2, B3=B-3 2if %A% equ %B1% ( 3 echo No.1 4) else if %A% equ %B3% ( 5 echo No.2 6) else if %A% equ %B3% ( 7 echo No.3 8)

下記のように、差を求めて差で分岐する方法もありますが、計算はset /aで行うのは同じです。
ただ、書いてみた物の、この方法はやめた方が良いですね。大きいケースから書かないといけないなどあるし。

CMD

1call :B_MINUS_A 2if ERRORLEVEL 3 ( 3 echo No.3 4) else if ERRORLEVEL 2 ( 5 echo No.2 6) else if ERRORLEVEL 1 ( 7 echo No.1 8) else ( 9 echo No. 0 10) 11exit /b 12 13:B_MINUS_A 14set /a Diff=B-A 15exit /b %Diff%

まだ、こっちの方がましか。

CMD

1set /a Diff=B-A 2goto :WHEN_%Diff% 3 4:WHEN_1 5echo No. 1 6exit /b 7:WHEN_2 8echo No. 2 9exit /b 10:WHEN_3 11echo No. 3 12exit /b

差が1,2,3のどれでもない場合は、gotoがエラーになります。

あと、ifでの比較では「文字列としての比較」「数値としての比較」の両方があります。
どういうケースでどっちになるかの説明は、if /?を実行すると詳しく表示されます。

CMD

1if 01 == 1 echo 等しい 2if "01" == "1" echo 等しい 3if 01 equ 1 echo 等しい ・・・・・この時だけ「等しい」と表示される 4if "01" equ "1" echo 等しい

こういった初歩的な躓きがかなり多く勉強不足であると感じるため、おすすめの入門サイト等をご存じでしたら教えていただきたいです。

何らかの言語でのプログラミング経験(注2)と十分な日本語読解能力があれば、set /? if /? for /?などを読むだけで良いのですが、プログラミング経験がないのなら、まずはプログラミングに入門するのが良いと思います。

(注2) バッチスクリプトはかなり変な仕様なので、「世の中には変な言語もある」という認識も必要でしょう。
「私の知っている~~言語ではこうだから、バッチスクリプトでも多分こうだろう」は半分くらいは通用しないと思った方がいいです。

投稿2024/12/06 12:39

otn

総合スコア85989

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

assemble

2024/12/10 05:59

ご回答ありがとうございました。 数値演算は条件には直接配置できないのですね。 gotoを用いた方法が私のプログラムには最適そうなので参考にさせていただきます。 また、勉強に関する質問にもお答えいただきありがとうございました。
guest

0

https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/set_1

  • /a パラメーターを使用すると、次の演算子が、優先順位の高いものから順にサポートされます。

計算結果をいったん変数に入れておく必要がありそうです。

set /A B1=%B% - 1 if "%A%" equ "%B1%" (

投稿2024/12/06 08:01

編集2024/12/06 08:02
int32_t

総合スコア21775

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問