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

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

新規登録して質問してみよう
ただいま回答率
85.48%
コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

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

Q&A

4回答

2658閲覧

バッチファイルをexe化した際の実行パスの挙動

emanu

総合スコア2

コマンドプロンプト

コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

バッチファイル

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

0グッド

0クリップ

投稿2022/06/29 12:59

編集2022/06/29 13:12

バッチファイルをexe化した際の実行パスの挙動について

・実行中のバッチファイルと同階層に存在する特定のファイルを、指定のフォルダに移動させる
・移動に失敗した場合、エラーログをバッチファイルと同階層に生成する
という動きをバッチファイルで行っています。

samole.bat

1cd /d %~dp0 2copy sample.html %userprofile%\Documents 3if %errorlevel% == 0 ( 4 if exist %userprofile%\Documents\sample.html ( 5 echo 終了コード %errorlevel%:コピー成功 >> error.log 6 ) 7) else ( 8 echo 終了コード %errorlevel%:コピー失敗 >> error.log 9 copy sample.html %userprofile%\Documents  >> error.log 2>>&1 10 echo; >> error.log 11 exit /b 12)

バッチファイルで実行する場合は想定通りの挙動になる(デスクトップに作ったフォルダに.batファイルを入れ実行するとエラーログも同階層に生成される)のですが、
書き換えられないようにexe化したく、Visual batでexeにデスクトップのフォルダから実行し、
実行パスを取得すると、下記となっています。

C:\Users\user名\AppData\Local\Temp

以前pyファイルをexe化した時も同様のことが起こり、調べたところ
①スクリプトの実態をtemporaryフォルダににコピーする
②スクリプトを実行する
という流れのため置いた場所と、実行している場所が異なるというのが分かりました。
そのため、今回も同様だと思うのですが、.batでの実行ファイルまでのフルパスを取得する方法が調査しても掴めず、考え方をご教示いただきたいです。

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

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

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

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

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

otn

2022/06/29 23:49 編集

> .batでの実行ファイルまでのフルパスを取得する方法 調べるべきは、EXE化に使用したツールの仕様でしょう。そのツールでの %~dp0 が何を表すのか。
emanu

2022/06/29 22:51

アドバイスいただきありがとうございます。 ご指摘いただき、visual batでのexe生成時の挙動について調査していたのですが、思うような内容に辿り着けておらず、大変申し訳ないのですが、どのようなキーワードで調査すべきかご教示いただけないでしょうか。 調べたのは、exe化する際の展開先、dp0、visual batの仕組みなどです。
otn

2022/06/29 23:49

Visual batのサイト(どこ??)を隅から隅まで読むのでしょうかね。
guest

回答4

0

どのようなキーワードで調査すべきかご教示いただけないでしょうか。

Visual batのサイト(どこ??)を隅から隅まで読むのでしょうかね。
昔からあるBATをCOM化、EXE化するツールだと同じであれば、
・どこかに元のファイルを復元する
・そのファイルをcmd.exe で実行する
で実行しているでしょうから、%0 はその復元後のファイルを示します。
隅から隅まで読んで探すべきは、
・元のEXEファイルと同じディレクトリに復元する設定(これだと%0は変わりますが%~dp0は期待通りになる)
・何らかの環境変数に元のEXEファイル名が入ってないか(その環境変数から場所がわかる)
のどちらかの機能が無いかですね。どちらの機能も無ければ無理でしょう。

投稿2022/06/29 23:58

otn

総合スコア84555

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

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

0

%cd% を使うとよいかもしれません。
ちょっと visualbat を試したところ、コンソールありも無しも exe が置いてあるパスになっていました。

投稿2022/06/29 23:26

sigsegv

総合スコア895

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

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

0

Windows上で実行ファイルをどう実行するかでカレントディレクトリはいろいろ変わってきます。
EXEファイルを直接ダブルクリックして実行させるなら、そのファイルの場所がカレントになりますが、そいつのショートカットを作ってそれを実行させる、となると、そのショートカットに設定された作業フォルダがカレントとなります。
んではその作業フォルダの欄を空白にするとどうなるか、ってのもあるのでいろいろ実験してみましょう

#そのうえで、Visualbatというシロモノがそこらへんどうしてるのか、ってのが加わりますが。

投稿2022/06/29 23:14

y_waiwai

総合スコア87774

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

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

0

思いついたんですが、VisualBatのEXEはコンソールウインドウのタイトルにフルパスが入っているので、
それをpowershellで取得解析して環境変数に収める方法はどうでしょうか?

@echo off setlocal for /f "usebackq delims=" %%A in (`powershell $p ^= [system.console]::title^; Split-Path $p -Parent`) do set BASEPATH=%%A echo %BASEPATH% pause

ただConsole非表示でビルドしても取得できるのかPowerShellでMessageBoxを表示する方法で試してみたらダメでした…

@echo off setlocal for /f "usebackq delims=" %%A in (`powershell $p ^= [system.console]::title^; Split-Path $p -Parent`) do set BASEPATH=%%A powershell Add-Type -Assembly System.Windows.Forms; [System.Windows.Forms.MessageBox]::Show('%BASEPATH%', 'パス')

投稿2022/06/29 14:29

RiaFeed

総合スコア2701

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問