dos batch programを書いています。windows7です。


TEXT.TXTにはabcがあります。しかし、findとnot findが両方出力されてしまいます。

どうしてでしょうか?

@echo off
find "abc" text.txt
echo %errorlevel%
if errorlevel==0 GOTO LABEL1
:LABEL1
echo find

if errorlevel==1 GOTO LABEL2
:LABEL2
echo not find

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/04/17 20:56:25
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答4件)

id:Sampo No.1

回答回数556ベストアンサー獲得回数104

ポイント25pt

落ち着くのだ。

@echo off
find "abc" text.txt
echo %errorlevel%
if errorlevel==1 GOTO LABEL2
echo find
GOTO END

:LABEL2 
echo not find

:END
id:mai_mai_mail

さすがです。ありがとうございます。次はfindはerrorlevel=2があるのでlabel0,1,2を作ろうとおもっています。

2014/04/10 23:40:01
id:cdaotg No.2

回答回数123ベストアンサー獲得回数35

ポイント25pt

Windows 7 Pro x64で試してみました。
下記の様に、GOTOからechoまでをカッコでくくると正常に動作します。

@echo off
find "abc" text.txt
echo %errorlevel%

if errorlevel == 0 (

GOTO LABEL1
:LABEL1
echo find

)

if errorlevel == 1 (

GOTO LABEL2
:LABEL2
echo not find

)

IF文はその直後の一文だけに対して作用するはずですので、元のコードではGOTOだけがIF文の分岐対象になるのではないでしょうか。

id:mai_mai_mail

ありがとうございます。xxxxxxxをfindするようにするとfindとnot findが両方表示されてしまいます。どうしてか分かりますか? 実は私が書いていたときも同じ現象で分からずじまいでした。
よろしくお願いします。

2014/04/10 23:41:21
id:cdaotg

すいません、色々調べてみたのですが分かりませんでした。
私の環境でも、xxxxxxxを検索するとfind,not find両方が表示されます。

2014/04/11 11:48:56
id:psne No.3

回答回数605ベストアンサー獲得回数334

ポイント25pt
@echo off
find "abc" text.txt
echo %errorlevel%
if errorlevel==0 GOTO LABEL1
:LABEL1 
echo find

goto KOKONITOBU

if errorlevel==1 GOTO LABEL2
:LABEL2 
echo not find

goto KOKONITOBU

:KOKONITOBU
pause

GOTOをつかってみましょう。

他1件のコメントを見る
id:mai_mai_mail

ありがとうございます。abcでfindしてfindと表示されました。ちなみにxxxxxxとしてもfindと表示されました。xxxxxxxはtext.txtにはないです。もしよろしければなぜ、どちらのパターンでもfindと表示されてしまうか教えてくれますか?私もずーとこれで悩んでいました。

2014/04/10 23:39:02
id:psne

すみません。飛び先に釣られて見てしまったので、この回答では上手くいっていないかと思います。
No4(この下)の回答内容で上手く動作します。
http://q.hatena.ne.jp/1397137974#a1227238

2014/04/10 23:50:18
id:a-kuma3 No.4

回答回数4971ベストアンサー獲得回数2153

ポイント25pt

if 文の書き方も間違ってるんですが、そこがあってたとしても、GOTO の飛び先が良くない。
f:id:a-kuma3:20140410232046p:image

if 文での ERRORLEVEL の扱い方も、違ってます。
よくあるプログラミング言語と違って、== のような演算子が入りません。
http://technet.microsoft.com/en-us/library/cc754335.aspx

Syntax
if [not] ERRORLEVEL <Number> <Command> [else <Expression>]
if [not] <String1>==<String2> <Command> [else <Expression>]
if [not] exist <FileName> <Command> [else <Expression>]


んで、こんな感じ。

@echo off
find "abc" text.txt
echo %errorlevel%
if ERRORLEVEL 1 GOTO LABEL1
echo find
GOTO LABEL2

:LABEL1
echo not find

:LABEL2

id:a-kuma3

あっ、演算子入れても、通りますね (^^;

2014/04/10 23:34:19
id:mai_mai_mail

ありがとうございます。よく分かりました。

2014/04/11 00:04:54
  • id:cx20
    「VisualBat」というツールを使うとバッチファイルをステップ実行して確認できるので便利です。

    ■ 【レビュー】編集やデバッグが簡単になるバッチファイル向け統合開発環境「VisualBat」 - 窓の杜
    http://www.forest.impress.co.jp/docs/review/20140204_633694.html

    が、便利です。

    ↓ステップ実行の例

    ■ バッチファイル向け統合開発環境「VisualBat」を試してみる - CX's Hatena Blog
    http://cx20.hatenablog.com/entry/2014/02/05/002139

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません