• ベストアンサー

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サブディレクトリでも、何階層下でも)」実行を中断するにはどうすればいいのでしょうか。

noname#15902
noname#15902

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

  • ベストアンサー
  • 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

  • batファイルでフォルダの有無を確認

    ある業務ソフト終了時にバックアップが行われC:\temp内にフォルダが作成されます。 (例) bacuk01フォルダ ※名前はランダムで作成される そのフォルダがあるかどうかを確認してあれば処理を実行するというbatが作成したいと思っているのですが、以下の内容で処理を行うとフォルダがなくてもあるように認識され処理が実行されてしまいます。どうすればよいでしょうか? if exist C:\temp\ goto ~ goto end :~ 処理内容

  • 「ファイル名を指定して実行」で見に行くディレクトリとautoexec.bat

    Windows98SEです。 スタート→ファイル名を指定して実行 で、例えば、notepadと入力すると、メモ帳が立ちあがりますよね。 ディレクトリを指定しなくても実行できるということは、見にいくディレクトリの設定がどこかでされているのだと思いますが、どこでされているのでしょうか。 過去の質問と回答(下記)によると、 「コマンドプロンプトでpathと入力したとき表示されるのが、コマンドプロンプトでカレントディレクトリを移動しなくても見に行くフォルダ」 なのだそうです。 そしてそれは、c:\Autoexec.batの中の PATH=......... で設定されているのだそうです。 私が思うのは、「ファイル名を指定して実行」のときもそれがきいているんじゃないかなあ、ということです。 私のPCでは、コマンドプロンプトでpathと入力すると、 PATH=C:\WINDOWS;C:\WINDOWS\COMMAND と表示されます。 C:\WINDOWSにはnotepadがあります。それはそれでいいのです。 でも、よくわからないのは、私のPCの c:\Autoexec.bat には、 PATH=.... というのがないのです。そのファイルには、 loadhigh C:\WINDOWS\COMMAND\nlsfunc.exe C:\WINDOWS\country.sys と書いてあります。(これですべて) これでいいのでしょうか。 それとも、「ファイル名を指定して実行」の場合は、 c:\Autoexec.bat は関係ないのでしょうか。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=6175

  • .bat(バッチ)から.batを実行したいのですがエラーになってしまいます。

    <やりたい事> (1)メニュー的なバッチからOracleインストール後 (2)OracleのDB作成sqlを実行する.bat(バッチ)を実行する。 <現状> メニュー的バッチから(2)をCALLで呼びだすと「内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」とコンソールに表示されてしまいます。 コマンドの拡張子を実行できる設定になっている事は確認できています。 また、コマンドプロンプトから(2)のバッチを実行すると実行できました。 色々と調べて見たのですが原因、解決策が見つかりません。 どうか皆様のお力をお借りできればと思います。 宜しくお願いします。 ↓以下バッチの詳細 <(1)メニュー的なバッチ> ECHO OFF :Start ECHO. ECHO 1. ・・・ 運用APLデータベース設定 %P5% ECHO 99. ・・・ 終了 SET Process= SET Choice= SET /p Choice=Type 選択して下さい。 IF '%Choice%'=='1' GOTO MakeDB :MakeDB REM 5. 運用APLデータベース設定選択時 SET Process=運用APLデータベース設定 ECHO *** "%Process%"開始 *** REM 文字変換バッチ実行 CALL C:\TEMP\aaaa.bat IF ERRORLEVEL 1 GOTO ExceptionError :InputError REM 入力エラー時 ECHO 不正なパラメータが入力されました。 GOTO Start :ExceptionError REM 例外エラー時 ECHO ******** 失敗しました。 ******** GOTO Start :End REM バッチを終了する。 EXIT <(2)OracleのDB作成sqlを実行する.bat(バッチ)> SET ORACLE_INSTALL_DIR=C:\oraclexe SET ORACLE_BIN_DIR=%ORACLE_INSTALL_DIR%\app\oracle\product\10.2.0\server\BIN SET ADMIN_DIR=%ORACLE_INSTALL_DIR%\app\oracle\admin\XE SET ORADATA_DIR=%ORACLE_INSTALL_DIR%\oradata\XE SET DBS_DIR=%ORACLE_INSTALL_DIR%\app\oracle\product\10.2.0\server\dbs SET USERNAME=aaa SET PASSWORD=bbb REM // LOGファイル名用に日付の取得 // FOR /F "tokens=1,2,3 delims=/, " %%i IN ('date /t') DO SET SYSDATE=%%i%%j%%k REM // 「Win31J」に文字変換 // ECHO 文字変換開始 %date% %time% >> "C:\install%SYSDATE%.log" "%ORACLE_BIN_DIR%\sqlplus" %USERNAME%/%PASSWORD% as sysdba @C:\TEMP\Drop.sql >> "C:\install%SYSDATE%.log" IF ERRORLEVEL 1 GOTO ExceptionError ECHO DBユーザー作成開始 %date% %time% >> "C:\install%SYSDATE%.log" "%ORACLE_BIN_DIR%\sqlplus" %USERNAME%/%PASSWORD% as sysdba @C:\TEMP\CreateDB.sql >> "C:\install%SYSDATE%.log" IF ERRORLEVEL 1 GOTO ExceptionError

  • 複数のbatファイルを自動実行したい

    複数のbatファイルがあり、それをさらにバッチ化したいのですが 1行目のbatファイルしか実行してくれません。 原因と対応をご存知であれば 教えて下さい。 以下のhhh.batを実行した場合、aaa.batしか実行してくれません。 (もちろん、単体ではそれそれ実行できます。) hhh.batファイルの中身 c:\aaa.bat c:\bbb.bat c:\cccbat

  • ディレクトリ下のファイルとサブディレクトリを全削除

    バッチファイル作成の際、分からないことがあるのですが。 タイトルの通り、ディレクトリ下のファイルとサブディレクトリを全削除したいのですが、そのディレクトリ自体は残したいのです。 例えば "Temp"以下の全ファイルとサブディレクトリを削除したい場合 del "Temp" /s とするとサブディレクトリは残ってしまい、 rd "Temp" /s とすると"Temp"自体削除されてしまいます。 この場合、一度rdコマンドで削除した上でmdなどで新たにディレクトリを作成してやるしかないのでしょうか?

  • Excel VBAでbatファイルを実行

    ExcelのVBAでbatファイルを実行し、 batファイル内でセットした環境変数を取得することは可能でしょうか? batファイルの内容は set MYDRIVE=E: set MYDIR=%MYDRIVE%\WORK のような感じです。 環境変数「MYDIR」の値をVBA側で取得できないかと思い、 ' 参照設定: Windows Script Host Object Model Sub ボタン1_Click() Dim myWshShell As New WshShell Dim myLong As Long Dim myWshEnvironment1 As WshEnvironment Dim myWshEnvironment2 As WshEnvironment Dim myWshEnvironment3 As WshEnvironment Dim myWshEnvironment4 As WshEnvironment myLong = myWshShell.Run("E:\work\test.bat") Set myWshEnvironment1 = myWshShell.Environment("System") Set myWshEnvironment2 = myWshShell.Environment("User") Set myWshEnvironment3 = myWshShell.Environment("Volatile") Set myWshEnvironment4 = myWshShell.Environment("Process") ' ブレークポイントを設定して内容確認 Set myWshShell = Nothing Set myWshEnvironment1 = Nothing Set myWshEnvironment2 = Nothing Set myWshEnvironment3 = Nothing Set myWshEnvironment4 = Nothing End Sub のようなコードを書いてみて「myWshEnvironment1」~「myWshEnvironment4」の内容を ウォッチ式で確認してみましたが、batファイルの中でセットした「MYDIR」の値は 含まれておりませんでした。 batファイルで設定した環境変数の値を取得する方法があれば 教えていただけないでしょうか?

  • bat ファイルの実行制御

    10台(例)A/B/C/D/E/F/G/H/I/J PCがありそのうちの5台A/B/C/D/Eはbatファイルの処理を途中までとしたいです。 batファイルを実行した際に実行しているPCの名前を確認して処理を続行or終了 したいのですが何か良い方法はないでしょうか? 例えばテキストファイル内にA~EのPC名を記載しておいてbatファイル実行時にはテキストファイルを確認して該当のPCじゃないか確認 等・・・

  • Windows3.1でバッチ(.bat)の実行について

    Windows3.1でバッチ(.bat)の実行について 10数年前の某装置の組み込みPC(日本語MS-DOS/V6.2 & 日本語MS-Windows3.1)でDOSの バッチファイルを動作させたいです。 CドライブはIDE2GByte、DドライブにSCSIのMOという構成です。 D:\tempにデータが溜まっていきます。これをC:\transというディレクトリにWindows のアイコンをクリックすることで移動させたいです。 次のようなバッチファイル(idou.bat)作成しました(△はスペースの意味です)。 del△c:\trans\*.* move△d:\temp\*.*△c:\trans\. できたファイルをファイルマネージャのあるグループにドラッグするとアイコンができたので、 ダブルクリックで実行したところ、1回目はうまくいったように見えます。 再度、D:\tempにデータが溜まったところで、アイコンをクリックすると、     「アプリケーションエラー#$%」でハングアップしたり、     「c:\>」とwindouwsを抜けたりしてしまいます。 DOS窓で実行すれば問題ないのですが、アイコンから実行したいです。 なにか方法がありますでしょうか?

  • フォルダー内の複数ファイル名を一括で変名するbat

    フォルダー内の複数ファイル名を一括で変名するbatを教えてください。 batは、デスクトップに配置して 処理するフォルダーをD&Dして処理させる形式をとしたいです。 以下のような形式です。  No1 aaaa bbbb [com : *********].zip を  No1 aaaa bbbb.zip に変名する。   (*******は任意の文字列) 例えば、 No1 aaaa bbbb [com : taken2110221100014].zip であれば No1 aaaa bbbb.zip に変名する。 以下が参考になりそうなので https://oshiete.goo.ne.jp/qa/9263608.html 記事中の助言を元に以下のようにコードを修正してみましたが うまく処理できませんでした。 bat(test,bat,test2.bat)のどこを再修正すれば希望の処理ができますか ? 希望は、下記ですが 「batは、デスクトップに配置して 処理するフォルダーをD&Dして処理させる形式をとしたいです。」 batを修正してもこのbatでは、D&Dで処理することは可能で無い場合は アドバイス又は他の参考なりそうなURLを紹介ください。 '------------------------------------------ rem test.bat echo off for /F "delims=" %%f in ('dir /*.mp4') do call :sub "%%f" exit /*.mp4 :sub set fname=%~1 set n=0 :loop call set c=%%fname:~%n%,1%% set /a n=n+1 if "%c%"=="" goto :EOF if "%c%"=="[com" goto break goto loop :break set /a n=n-1 set ext=%~x1 call set newname=%%fname:~0,%n%%% call set newname=%newname%%ext% if "%newname%"=="" goto :EOF if "%newname:~0,1%"=="." goto :EOF ren "%fname%" "%newname%" goto :EOF '-------------------------------------- rem bat2.bat for /F "tokens=1* delims=[com" %%F in ('dir /b *.mp4') do echo move %%F[com%%G %%F.mp4 '--------------------------------------

  • ステップインで実行しても中断させない方法を教えてく

    エクセルでOLEObjectを削除するコードを、 ブレークポイントを設置して実行すると、 デバッグモードでやると「中断モードでは入力できません」となります。 (エクセル2007です) 例えば、 Sub オブジェクト削除() ActiveSheet.OLEObjects.Delete Selection.Value = "a" End Sub で、「Selection.Value = "a"」の部分にブレークポイントを設置して、 F8で一行ずつ実行していこうとすると画像のようになります。 なぜなのでしょうか? 今サンプルで提示したコードは短いのでいいのですが 実際のコードはもっと長いので、 ステップインでコードの動きを見ていきたいのですが ActiveSheet.OLEObjects.Delete の部分で、エラーになってしまいます。 その際、「継続」と「終了」のどちらを選んでもOLEObjectsは削除されます。 「終了」の場合はその次のコードの、 Selection.Value = "a" は実行されません。 ブレークポイントを設置せず、F5で一気に実行する場合はエラーになりません。 コードの中に、 ActiveSheet.OLEObjects.Delete があってもステップインで実行しても中断させない方法を教えてください。