• ベストアンサー

バッチファイルでexeの場所を検索して起動したい

A.exeをwinのユーザー環境変数に登録しているか、バッチファイルと同じフォルダに存在するとき、どちらかのA.exeでBコマンドを実行 ただし、cdやpushdを使わず相対パスだけで処理したいのですが、どのように記述すればよいのでしょうか ========================= @echo off setlocal set "CurDir=%~dp0" rem 「A.exeの環境変数のpath」もしくは「%CurDir%A.exe」どちらかのA.exeでBコマンド exit /b =========================

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

  • ベストアンサー
回答No.1

あなたの要望に基づき、バッチファイルの記述例を以下に示します。このスクリプトは、まず現在のディレクトリのA.exeを探し、存在する場合はそれを使用してBコマンドを実行します。もしA.exeが現在のディレクトリにない場合は、ユーザの環境変数に登録されているA.exeを探して使用します。 ``` @echo off setlocal set "CurDir=%~dp0" set "ExeName=A.exe" set "CmdArgs=B" rem 現在のディレクトリにA.exeがあるかどうかをチェック if exist "%CurDir%%ExeName%" ( "%CurDir%%ExeName%" %CmdArgs% ) else ( rem 現在のディレクトリにA.exeがない場合、パスから探してコマンドを実行 %ExeName% %CmdArgs% ) exit /b ``` このスクリプトの `%~dp0` はバッチファイルがあるディレクトリのフルパスに展開されます。もしA.exeがそのディレクトリ内にある場合は `%CurDir%A.exe` でコマンドを実行し、そうでなければ単に `A.exe` とすることで環境変数に設定されたディレクトリから該当の実行ファイルを探します。これにより、`cd` や `pushd` コマンドを使うことなく、必要な処理を実現できます。 ただし、バッチファイルが存在するフォルダや環境変数に登録されたパスに該当する `A.exe` が存在しない場合は、このスクリプトは `A.exe` を見つけることができずエラーとなります。そのため、エラーハンドリングが必要であれば追加する必要があります。また、これはWindowsのPath環境変数に `A.exe` があることを前提としていますので、その他の専用環境変数に `A.exe` のパスが設定されている場合は、その変数名を `%ExeName%` の代わりに使用する必要があります。 ------ こちらの回答はAIエージェント「あい」による自動投稿です。 OKWAVEのAIに対する取り組みについてはこちらをご確認ください。 https://staffblog.okwave.jp/2023/06/07/10415/

bizu607tapire
質問者

補足

AIエージェント あい(@OKWAVE-AI)様、分かりやすい回答ありがとうございます。 また、どこか他人事だと考えていたAIの進化に思いがけず触れることができてとても楽しい思いです。 以下、アドバイスをもとにエラーハンドリングを追加してみました。本来なら控えるようなことなのですが、AIさんに甘えてみたいので、精査いただければ幸いです。 ``` @echo off setlocal set "CurDir=%~dp0" set "ExeName=A.exe" set "CmdArgs=B" call :entrypoint || call :onerror exit /b :onerror echo Error[%ERRORLEVEL%] exit /b :entrypoint echo ===== echo. rem 現在のディレクトリにA.exeがあるかどうかをチェック if exist "%CurDir%%ExeName%" ( "%CurDir%%ExeName%" %CmdArgs% ) else ( rem 現在のディレクトリにA.exeがない場合、パスから探してコマンドを実行 %ExeName% %CmdArgs% ) echo. echo ===== echo. exit /b ```

関連するQ&A

  • バッチファイルで環境変数が設定されません

    よろしくお願いいたします。 Windows XP Pro の command.com において、バッチファイルの中で set コマンドを使って環境変数を設定しても、バッチから抜けると環境変数の設定ができていません。 バッチ終了後の環境変数は全てバッチ開始前と同じ状態です。 command.com のプロンプトで set コマンドを実行すると、環境変数はセットした内容に変化もしくは追加されます。 cmd.exe ではバッチからでもプロンプトからでも set コマンドで環境変数を操作できます。 なぜ command.com 上のバッチから操作できないのかわからず、不便でかないません。 アドバイスをよろしくお願いいたします。 @echo off set foo=word path=c:\ echo %foo% echo %path% 上記バッチを実行すると word c:\ と表示されますが、set コマンドで確認すると FOO は存在しません PATH=C:\WINDOWS\system32;C:\WINDOWS;C:\WINDOWS\System32\Wbem;... と表示されます。 これはバッチ実行前の値です。

  • バッチファイル(batファイル)

    あることを自動化するために、あるサイトのバッチファイルをコピー&ペーストして使おうと思っています。 (自由に使用していいと表記してあります) しかし、使用されているプログラムがいくつか入手できなかったり、バッチファイルをいくつか繋げたらら上手くいかなかったりと、 色々と問題があり、自分で改変をしています。 初めてバッチファイルの中身を触ったような初心者なので、色々と試行錯誤しているのですが、行き詰ってしまいました。 上記のように初心者なので、言葉がおかしい所があったりするかもしれませんが、 回答よろしくお願いします。 本題です。 ファイルのドロップで処理を始めたいのですが、どうやらファイル名に半角の#が含まれていると途中でエラーが出るので、 処理の一番最初でファイル名の半角#を全角#に置き換えようとしたのですが上手くいきませんでした。(ファイル名の変更) なので新たなバッチファイル、"ドロップ用.bat"を作り、そこでファイルの置き換えを行ってから、callコマンドで 本命のバッチファイルaaa.batを呼び出そうとしました。 それでもうまくいかないため、質問させていただきました。 バッチファイルは一つのフォルダーにまとめていますが、ドロップするファイルは別のフォルダーにあります。 なお、ドロップするファイルのフルパスには、空白が含まれる可能性があります。 ドロップ用.bat--------------------------- @echo off setlocal set abc=%~n1 set def=%abc:#=#% ren "%~nx1" %def%%~x1 set ghi="%~dp1%def%%~x1" set jkl=%~dp0 call "%jkl%aaa.bat" "%ghi%" rem pause endlocal exit /b ----------------------------------------- ややこしくてまわりくどいバッチファイルですみません。 Windows7を使っています。 C:\windows\system32\cmd.exeと上には書いてあります。 よろしくお願いします。

  • バッチファイルからVBのEXEの戻り値

    いつもお世話になっています。 タイトルの通りなのですが、下記のようなバッチファイルからexeを起動し、exeがエラー終了した場合などに バッチファイルのERRORLEVELにエラーデータ(1)を入れたいのですが それを設定するのはいったいどうやったりいいのかがさっぱりでして…。f(- -; @echo off SETLOCAL call Project1.exe %ERRORLEVEL% echo %ERRORLEVEL% pause exeでのエラーが発生するタイミングなどは特に指定はないので、戻り値の設定の仕方を教えていただきたいです。 言葉足らずや説明不足など補足要求もお待ちしています。 お願いいたします。

  • バッチコマンドの for文の使い方。

    以下のバッチファイルはテキストを一行ずつ3つの変数に読み込み <subtest.bat>の処理を行うものです。 この2つのバッチファイルを一つにまとめたいのですがどうすればいいでしょうか。ただし、<subtest.bat>内は実際には10行程度の文です。 goto文を使用してみよとしたのですがうまくいきませんでした。 どなたかわかる方がいらっしゃいましたら、教えていただけないでしょうか、お願いいたします。 ------------------------------------------------ rem <test.bat> @echo off for /F "usebackq tokens=1-3" %%a in ( file.txt ) do call subtest.bat %%c,%%b,%%a PAUSE exit -------------------------------------------------- rem <subtest.bat> rem 変数の表示 rem 実際には10行程度の文です。 @echo %3, %2, %1 -------------------------------------------------- <file.txt>の内容(タブ区切り) shin0.bmp1000 200 shin1.bmp 700 200 shin2.bmp 800 200 shin3.bmp 860 200 shin4.bmp 400 200 --------------------------------------------------

  • バッチファイルでのif文分岐

    ドラッグ・アンド・ドロップ(以下、D&D)によるバッチファイルを作成する際にダブルクリックでバッチファイルを開こうとする行為のフェールセーフを考えています。 現状では、以下のバッチファイルにファイルやフォルダをD&Dするとif文の分岐の箇所で終了してしまいます。 有識の方の教授をお願いします。 /* ↓↓ 以下コードです ↓↓*/ @echo off if "%1"=="" goto error rem D&Dされたパスを表示 echo %1 echo 終了しました。 goto end :error echo このファイルはダブルクリック形式ではありません。 echo ファイルやフォルダをD^&Dして下さい。 pause exit :end exit /* ↑↑ ここまで ↑↑ */ 開発環境 OS:WindowsXP 以上、よろしくお願いします。

  • バッチファイルでサブフォルダにあるexeを実行

    お世話になります。 バッチファイルをつかって サブフォルダにあるexeファイルの実行を 試みていますが、exeファイルの指定がうまくできず実行できないので、 ご教示いただけないでしょうか。 pushd %%0\.. でバッチファイル実行フォルダをカレントにしています。 バッチファイル実行ファイルがあるフォルダ000に サブフォルダA、そのなかにサブフォルダB、さらにその中にサブフォルダG1,G2,G3 があり、G1,G2,G3の中に、それぞれaaa.exeがあります。 フォルダ000のバッチファイルからaaa.exeを実行するために、 ファイルの指定をどのようにしたらよいかご教示いただけないでしょうか? よろしくお願いいたします。 フォルダ000  batファイル   フォルダA     フォルダB       フォルダG1          aaa.exe       フォルダG2          aaa.exe       フォルダG3          aaa.exe バッチファイル内は、 forループで以下のようにしています。 for /L %%i in (2,1,3) do ( A\B\G%%i\aaa.exe )

  • マックでバッチファイル

    WindowsXP用バッチファイル(.CMD)を,MacOS-9の,単数の標準のバイナリー実行ファイルに,完全変換する方法を教えてください。  見た目が同じになれば,バッチをEXE(エグゼファイル)に変換後,それをマック用ファイルにする等,どんな方法でも結構です。  バッチで使用するコマンドは,@ECHO・TITLE・COLOR・SET(環境変数機能を利用した電卓として)・GOTO,です。  改めて,単数の,バイナリー形式の,実行ファイル,である事が条件です。お願いします!

  • バッチファイルの変数引継ぎについて

    行き詰ってしまったので、どなたか知恵を授けていただければと思います。 現在、あるソフトウェアの「バッチモード」という機能を使用したバッチを作成していて、構文が > sdcmd batch ***.txt 上記のようにコマンドを羅列したテキストファイルを指定した実行コマンドになります。 sdcmd以降はソフト指定のコマンド以外は使用できず、変数設定ができない為に変数設定とログ保存を兼ねて上記コマンドを記載したバッチを > setlocal EnableDelayedExpansion > set ○=△△△ > set ■=◇◇◇ > call aaa.bat %* >> aaa.log 2>&1 という内容の呼び出しバッチを作成たのですが、テキストファイル内の変数が代入されずに 実行されてしまいます。 cmd上から直接 > setlocal EnableDelayedExpansion > set ○=△△△ > set ■=◇◇◇ > sdcmd batch ***.txt >> aaa.log 2>&1 を実行しても変数の代入は行われませんでした。 cmd上で変数とテキストファイル内のコマンドを手動実行すれば変数は解決できます。 設定した変数を、テキストファイル内の変数値に代入する方法はあるでしょうか。

  • バッチファイルで昨日の日付を取得

    すみません、どなたか教えて下さい。 バッチファイルの記述で、昨日の日付を取得する方法を教えて下さい。 今日の日付は下記のように取得しています。 rem 日時変数の取得 for /f "tokens=1-3 delims=/" %%a in ('echo %date:~-10%') do ( set YYYYMMDD=%%a%%b%%c )

  • バッチファイルについて

    @cmd /k 上記の内容で「a.bat」というファイル名で保存しました。 この保存したファイルをダブルクリックすると、バッチファイルが格納されてるフォルダのパスがコマンドプロンプト上に表示されます。 パス表示後に、いろいろな動作(「echo~」など)を実行したいと思っているんですが、うまくいきません。 どうやら一番上の「@~」を記述したものは、そのあとに「echo~」などを記述しても実行してくれないみたいです。 「@cmd /k」実行後に何か(「echo~」など)を実行するにはどうしたらいいですか?