• ベストアンサー

batファイルで、あるディレクトリ配下に存在する場合は、実行を中断

batファイルのコードで、 このbatファイルがある特定のディレクトリ内にある場合は、即座に実行を中断するようにしたいのですが、どうすればよいでしょうか。 詳しく述べます。 あるbatファイルがあります。 このbatファイルは、普段、マウスでダブルクリックして実行しています。 仮に、このbatファイルが C:\Temp\a というディレクトリにある場合に実行を中断するには、 ======================== set ThisScriptPath=%~dp0 if "%ThisScriptPath%" == "C:\Temp\a\" goto END ・・・ :END set ThisScriptPath= ======================== というようなコードを入れておけばいいと思います。 しかし、C:\Temp の中の「どのサブディレクトリにbatファイルがある場合でも(aサブディレクトリでもbサブディレクトリでも、何階層下でも)」実行を中断するにはどうすればいいのでしょうか。

質問者が選んだベストアンサー

  • ベストアンサー
  • OsieteG00
  • ベストアンサー率35% (777/2173)
回答No.1

こんなかんじでしょうか。 @echo off cd | find /i /v "c:\temp" if errorlevel 1 goto end dir :end exit もしうまくいかなかったらこちらを。 @echo off cd > cdcheck.dat find /i "c:\temp" < cdcheck.dat > nul if errorlevel 0 goto end dir :end del cdcheck.dat > nul exit

noname#15902
質問者

お礼

ご回答ありがとうございます。 上のもので大丈夫です。 自分用に解説をつけておきます。 ---------------------------- ●cd 単にcdだけだと現在のディレクトリが表示される。 ●find 「パスが指定されていないときは、プロンプトで入力されたテキストまたは別のコマンドからパイプ処理で渡されたテキストを検索します。」(find /?) /i 大文字と小文字の区別をしない。 /v 指定した文字列を含まない行をすべて表示するオプション。 ●errorlevel 「ここでfindの検索結果の状態(指定した条件にマッチする文字列が見つかったかどうか)を調べる方法について述べておこう。 このfindでは、検索結果の状態をerrorlevel(直前のコマンドの実行結果を表すコマンド)を使って通知することができる。 検索が成功した場合には、errorlevelの値は0になるが、検索が失敗した場合(該当の文字列がなかった場合)には、errorlevelは1となる。 また、引数の指定方法などが間違っていてエラーとなった場合は(例えば、検索文字列をダブルクォートでくくっていないときは)、errorlevelは2となる。 ifコマンド中でこのerrorlevelの値を調べることにより、検索結果に応じた処理を行うことができる。」 (http://www.atmarkit.co.jp/fwin2k/operation/command006/command01.html) find には /v オプションが付いているので、パスに"c:\temp"が含まれていない場合に、検索が成功してerrorlevelが0になる。 ●if errorlevel 1 goto end errorlevelが1以上のときに、「end」へ行く。 「パスに"c:\temp"が含まれていない」場合 → 検索が成功 → errorlevelが0 → ifの条件が成立しない。 「パスに"c:\temp"が含まれている」場合 →  検索が失敗 → errorlevelが1 → ifの条件が成立。→ endへ行く。

その他の回答 (6)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.7

#5>if "%top%" == "C:\Temp" goto END の部分のことですね。 そうです。 本人がわかっていれば済むことですですが、老婆心デス。

noname#15902
質問者

お礼

ありがとうございました。

回答No.6

なにやら、私一人でこのスレッド(この表現で正しいかわかりませんが)を汚しているような気がしてきました・・・ それはさておいて、質問の中に ====== C:\Tempの中の「どのサブディレクトリにbatファイルがある場合でも(aサブディレクトリでもbサブディレクトリでも、何階層下でも)」 ====== とあったので、 チェックは 「固定のフォルダ配下全てのフォルダに自分と同名のバッチファイル(自分も含む)があるか?」 だと勘違いしていたようです。すいません。 「自分がいるのはC:\Temp配下か?」であれば、forを使った方がらくちんかもですね。 ただ、「C:\Temp」が物凄く長いパスだった場合とか、起動されるたびにパスが違うとかの場合は、また一捻り必要かもしれません。

noname#15902
質問者

お礼

>チェックは >「固定のフォルダ配下全てのフォルダに自分と同名のバッチファイル(自分も含む)があるか?」 >だと勘違いしていたようです。 質問文で、「自分」という言葉を適切に使ったほうがよかったかもしれません。 いずれにしても、どのご回答も参考にさせていただきます。ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.5

#2>あとはこれを応用すればいいんですね。 そうです。 やっていることは、パスの先頭部分の切り出しをして、調べたいフォルダと一致するか比較するということです。(一致すればその配下にある) あと、アドバイスですが、 文字列の比較の時には ABC == abc は一致しませんので、 /i ABC == abc のように /i オプションを付けた方がいいです。 処理を実行していって、バッチファイルを見つけた時というような意味なら exist が使えると思います

noname#15902
質問者

お礼

ありがとうございます。 >/i ABC == abc >のように /i オプションを付けた方がいいです。 if "%top%" == "C:\Temp" goto END の部分のことですね。

回答No.4

あぁ・・・ ごめんなさい。 dirの所にパスつけるの忘れてました。 正しくは ↓ですね・・・ ========================= set me=%~xn0 dir /S "C:\Temp" | find /i /c "%me%" if errorlevel 1 echo ほげ! ========================= あと、if文の後も簡単に確認する為にechoにしてあります。 それと、同名のディレクトリがあると、とまってしまうのでそれも気にしないといけないですね。 混乱させるような回答をしてしまって申し訳ない。

noname#15902
質問者

お礼

ありがとうございます。 "C:\Temp" の下のファイルをすべて挙げて、その中に当該batファイルが存在するかどうか調べるということですね。そして、存在しない場合だけ「ほげ!」を表示させる、ということですね。 ご回答のコードの意図はわかりました。 しかし、実行しようとしているbatファイルが別の場所(C:\aaaaaとか)にあるのに、同名のbatファイルが "C:\Temp" 配下にあったら止まってしまいますね。(実は、私の場合には、それだと困ります。) >それと、同名のディレクトリがあると、とまってしまうのでそれも気にしないといけないですね。 仮にバッチファイル名がaaa.batだとすると、「同名のaaa.batという『ディレクトリ』が "C:\Temp" の配下にあったら」という意味ですか? そうですね、(可能性は少ないですが)その可能性も捨てきれないですね。

回答No.3

Windows2000ですが、以下でよいのではないかと。 OsieteG00さんとほぼ同じですね。 ========================= set me=%~xn0 dir /S | find /i /c "%me%" if errorlevel 1 echo ほげ! =========================

noname#15902
質問者

補足

ご回答ありがとうございます。 dir /S って言うのは、 「指定されたディレクトリおよびそのサブディレクトリのすべてのファイルを表示します。」 っていうことですよね。 やってみたところ、配下にたくさんディレクトリやファイルがあるとdir /S | find /i /c "%me%" のところで、時間がかかるようです。 また、 「ある特定のディレクトリ内にある場合は、実行を中断するようにしたい」 ということなのに、 なぜその特定のディレクトリがコードの中に書かれていないのか が私には理解できません。 もしよろしければ、そこらあたりを解説していただけるとありがたいです。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

サンプル for /F "delims=\ tokens=1-2" %i in ("C:\temp\a") do set top=%i\%j のようにすると、 %iに「C:」%jに「temp」 が取り出せますから for /F "delims=\ tokens=1-2" %i in ("%~dp0") do set top=%i\%j として if "%top%" == "C:\Temp" goto END とすればいいと思います。

noname#15902
質問者

お礼

ありがとうございます。わかりました。 以下のようなbatファイルを書いてみて、あとはこれを応用すればいいんですね。 ================ @echo off for /F "delims=\ tokens=1-2" %%i in ("C:\temp\a") do ( set top1=%%i set top2=%%j) echo top1=%top1% echo top2=%top2% ================

関連するQ&A