ファイル保存場所への移動手段をまとめる方法

このQ&Aのポイント
  • バッチファイル内で%~dp0としてファイルが保存されているディレクトリを取得する方法がありますが、その展開方法についてうまい回避方法はありません。
  • 他の方法として、バッチファイル内でset TEST=pushd %~dp0として環境変数を設定し、%TEST%と展開してファイルのディレクトリに移動する方法があります。
  • また、共通化部分ではsetlocalを使用するため、別ファイルに分割すると有効範囲が変更されるため、都合が悪いです。
回答を見る
  • ベストアンサー

コマンドライン引数の展開について

バッチファイル内で%~dp0とすれば ファイルが保存されているディレクトリを取得できます。 これを利用して環境変数に set TEST=pushd %~dp0 とセットし、 %TEST% と展開することによって バッチファイルのディレクトリに移動しようとしたのですが、うまく行きませんでした。 ファイルが保存されている場所への移動手段をわかりやすくまとめたいです。 それ以外にも各バッチファイルの先頭で行う処理を共通化する目的があります。 以下のように第一引数として渡すやり方もあるのですが、 test.bat---- call common.bat %~dp0 common.bat---- pushd %~dp1 setlocal 共通化部分ではsetlocalを使うため、 別ファイルに分割してしまうと有効範囲が変更され都合が悪いのです。 何かうまい回避方法はありますでしょうか? (そもそも環境変数内で%~dp0が展開されてくれれば済む話なのですが…)

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

  • ベストアンサー
  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.4

なんとなくやりたいことがわかりました。 バッチ起動前に環境変数に以下のようにセットしておき D:\>set x=pushd %~dp0^&setlocal 以下のようなバッチで実行したらどうでしょうか。 call %x% set x=delete call %x% で再評価している状況です。setlocalも効いているので、バッチ終了後環境変数xは元に戻っているはずです。

emuesuenu
質問者

お礼

callはバッチファイルの呼び出しにしか使えないと思ってましたが、 こういうやりかたもあるんですね。 ユーザー環境変数に pushd %~dp0^&setlocal とセットしておいて call %x%での呼び出しでやりたいことができるようになりました。 大変助かりました。 ありがとうございました。

その他の回答 (3)

  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.3

No.2 です。 バッチファイル内での話ではなく、コマンドプロンプト上での話のようですね。 > こちらでテストしたときはユーザー環境変数にセットしていました。 > あらためて確認しましたが > > %x% > としても > pushd %~dp0 > がそのまま流れ、 > 環境変数の展開は行われませんでした。 ユーザ環境変数というのは、システムのプロパティで設定する環境変数のことですか。 ここに、%~dp0 を書いてもなにも展開されませんよ。 %~dp0 の解釈を間違えられていると思います。 %0 や %1 などが意味を持つ(何かの値に展開される)のはバッチファイル内に記述して実行したときです。 %0 はバッチ内に記述されたときその実行したバッチ自身を示します。コマンドライン上で %~dp0 としても対象となるバッチファイルがどれなのかPCにはわかりませんよね。 >ファイルが保存されている場所への移動手段をわかりやすくまとめたいです。 ファイルが保存されてる場所が複数ある場合はどうしたいのですか? 具体的な例があると回避方法を提示できるかもしれませんね。

emuesuenu
質問者

補足

>%0 や %1 などが意味を持つ(何かの値に展開される)のはバッチファイル内に記述して実行したときです。 実際に展開されるのはバッチを実行したときですが、 ユーザー環境変数に登録している段階ではあくまで文字列です。 ですから環境変数を展開した後、 再帰的にコマンド引数の展開を行ってくれると思ったのですが、 どうも無理のようですね。 環境変数中の環境変数はWindowsのバージョンによって展開順が違ったりするので、 あまり考えて作られていないのかもしれません。 やりたいことは setlocalとcd%~dp0 です。 init.bat に setlocal cd%~dp0 と書くか、 ユーザー環境変数に setlocal&&cd%~dp0 とセットして、それがこちらの考えたとおりに展開されればOKのはずです。 ですが別ファイルに分ける方法ですとsetlocalの有効範囲が init.bat内で終わってしまうため、呼び出し元のバッチファイルへの影響させることができません。 つまり親のバッチファイルからinit.batをインライン展開的に呼び出すことができればよいのです。 ですがcallとは別の呼び出し方法は見つけられませんでした。

  • pita-gora
  • ベストアンサー率70% (102/145)
回答No.2

こんにちは >バッチファイルのディレクトリに移動しようとしたのですが、うまく行きませんでした。 うまくいかないというのは、具体的にどううまくいかないのでしょうか。 当方で以下のように試してみましたが、ちゃんとバッチファイルが配置されているディレクトリに移動されましたよ。 (Windows 7 のコマンドプロンプトで実行) ---------------------------- D:\>type tmp.bat set x=pushd %~dp0 echo %x% %x% D:\>c: C:\>d:tmp C:\>set x=pushd D:\ C:\>echo pushd D:\ pushd D:\ C:\>pushd D:\ D:\> ------------------------------

emuesuenu
質問者

補足

コマンドプロンプトで環境変数を設定した場合はうまくいくようです。 こちらでテストしたときはユーザー環境変数にセットしていました。 あらためて確認しましたが %x% としても pushd %~dp0 がそのまま流れ、 環境変数の展開は行われませんでした。

  • root139
  • ベストアンサー率60% (488/809)
回答No.1

単純に SET HOGE_DIR=%~dp0 ・ ・ ・ pushd %HOGE_DIR% ではダメなのでしょうか?

emuesuenu
質問者

補足

コマンドラインで設定したときはうまくいくようなのですが、 ユーザー環境変数にあらかじめセットしておくとダメなようです。 環境変数の文字列 pushd %~dp0 がそのまま流れてしまいます。

関連するQ&A

  • コマンドプロンプトのcallと遅延展開

    こんにちは。 コマンドプロンプトにおいて、call と !・・・! による環境変数の遅延展開について、 1つ疑問に思う事がありましたので、質問させて頂きました。 まず、以下のようなバッチスクリプトtest.batを作成しました。 -------------------------------------------------------- @echo off setlocal setlocal enabledelayedexpansion set aaa=XXX^|cat echo 1:!aaa! call echo 2:!aaa! echo 3:%aaa% call echo 4:%aaa% --------------------------------------------------------- これを実行した結果、以下のようになりました。 --------------------------------------------------------- C:\Users\kei >test.bat 1:XXX|cat 3:XXX 4:XXX --------------------------------------------------------- callは、それ以降のコマンドラインを2度解析するだけなのに、 なぜ、call echo 2:!aaa! の行を実行した時に、何も出力されないのでしょうか?

  • batファイル コマンド

    batファイルでSetを使用して変数を代入してそれをechoでテキストファイルに記載させようとしているのですが、なぜか記載できていません。 何故でしょうか?回答よろしくお願いします。 (例) set TEST=SUCCESS echo %TEST% %COMPUTERNAME%>> "%~dp0%\TEST.txt" 作成されたTEST.txtを開くと 「KAISYA_PC」【※PC名】と入力されており変数TESTの値「SUCCESS」が 入っていません。

  • バッチファイル 二つ上のディレクトリのパス取得

    "C:\test\sample\a.bat"を実行した時 %~dp0 で C:\test\sample\ と展開できるのですが、 この時 C:\test\ というパスを取得するにはどうすればいいでしょうか? バッチファイルから二つ上のディレクトリのパスを取得する方法を教えていただきたいです。 よろしくお願いします。

  • vbsからバッチファイル実行時の引数渡しについて

    vbsからバッチファイルを実行する時に、引数として変数を渡すことはできるでしょうか。バッチファイルは引数を受け取れる記述をしています。変数の値は常に変動します。 CreateObject("WScript.Shell").Run "C:\HULTOOL\test.bat",0 を使ってtest.batを実行しています。"C:\HULTOOL\test.bat aaa(aaa)は固定の数値ですという書き方で、バッチファイルがaaaを第一引数として受け取れることは試してできました。しかし、aaaを変数にすると成功しません。何かよい記述方法はあるのでしょうか。ご教授ください。

  • コマンドプロンプトにおけるコマンドライン引数の展開

    こんにちは。 コマンドプロンプトにおける、コマンドライン引数の展開のされ方について、質問させて下さい。 具体的に言うと、二重引用符で囲まれたコマンドライン引数が、 どのようにして各コマンドに渡されるのかを詳しく知りたいと思っています。 まずコマンドプロンプトが、コマンドラインの特殊文字を展開し、 それらが各コマンドに渡される事は知っています。 特に、2つの二重引用符で囲まれた文字列に含まれる特殊文字は普通の文字として扱われる事、 二重引用符は「\」によってエスケープできる事は知っています。 これらを理解した上で、以下のような事を試しました。 まず、以下のような、1.cというCプログラムを作成し、ビルドしました。 ____________________ #include <stdio.h> int main(int argc,char *argv[]) { int i; for(i=1; i<=9; i++) if(argv[i]) printf("argv[%d]=「%s」\n", i, argv[i]); return 0; } ____________________ 次に以下のようなバッチスクリプトを作成しました。 ____________________ @echo off echo %%~1:「%~1」 echo %%~2:「%~2」 echo %%~3:「%~3」 ____________________ その後、以下のようにして同じコマンドライン引数を、これらのプログラムに渡すと、 以下のような結果になりました。 ____________________ C:\Users\kei >1.exe "\"ab c\"" de argv[1]=「"ab c"」 argv[2]=「de」 C:\Users\kei >1.bat "\"ab c\"" de %~1:「\"ab」 %~2:「c\""」 %~3:「de」 ____________________ なぜ両者の出力結果に、違いが出るのかが分からず困っています。 コマンドプロンプロの仕様だと、1.exeの出力は予想通りだったのですが、 1.batの出力では、コマンドライン引数がスペースで区切られていると、 それらを二重引用符で囲んでも、1つの引数としてみなしてくれませんでした。 これだけでは不十分だと思い、以下のように、 Windowsコマンドではない、ダウンロードしてきたlessと Windowsコマンドであるtypeで、同じ事を試しました。 ____________________ C:\Users\kei >less "\"ab c\"" fa ab c: No such file or directory fa: No such file or directory C:\Users\kei >type "\"ab c\"" fa 指定されたファイルが見つかりません。 処理中にエラーが発生しました: \ab パラメータが間違っています。 ____________________ この結果をみると、lessでは1.exeと同じようにコマンドラインが解釈され、 moreでは1.batと同じようにコマンドラインが解釈されているようです。 こういった事実は 「まずコマンドプロンプトが、コマンドラインの特殊文字を展開し、 それらが各コマンドに渡される」 というコマンドプロンプトの仕様と矛盾しているので、頭が混乱しています。 こういった問題について、何か御存じの方がいらっしゃれば、情報提供をお願い致します。 長くなりましたが、よろしくお願い致します。

  • バッチファイルで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 =========================

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

    行き詰ってしまったので、どなたか知恵を授けていただければと思います。 現在、あるソフトウェアの「バッチモード」という機能を使用したバッチを作成していて、構文が > 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上で変数とテキストファイル内のコマンドを手動実行すれば変数は解決できます。 設定した変数を、テキストファイル内の変数値に代入する方法はあるでしょうか。

  • バッチファイルFTP -sで引数を渡せますか?

    どなたか教えて下さい。 TEST.batというバッチファイルの処理の中で、 FTP -s:D:\ABC.bat でファイルを指定して、FTPのputを実行させたいです。 putしたいファイルはTEST.bat内でsetで指定しています。そのsetで指定したファイルを引数などで、\D\ABC.batへ送る方法はないでしょうか?

  • VisualStudio(C#)2005ExpressEditionなんですが、コマンドラインコンパイラがしようできません(vsvars32.batがありません)

    この度、VisualC#2005ExpressEdiotionをインストールしました。日経ソフトウェアの3月号に製品版が付録としてついていたので、そのCD-ROMでインストールしました。 独習C#という本を買ったのですが、コマンドラインコンパイラcsc.exeの使用を薦めています。それを使用するためにはVSVARS32.batファイルを実行する必要があるのですが、インストールしたVisualC#のヘルプにはcommon7/toolsフォルダにそのバッチファイルがあるとかいてありますが、ありません。2回インストールしなおしたんですが。。ExpressEditionには、コマンドラインコンパイラは付属しないのでしょうか? 以下、該当ヘルプの全文のコピーです↓。 vsvars32.bat ファイルを使用すると、コマンド ラインからビルドするために必要な環境変数を自動的に設定できます。vsvars32.bat の詳細については、次の Knowledge Base の文書を参照してください。 「PRB: Vcvars32.bat Generates Out of Environment Message (Q248802)」 以前のバージョンの Visual Studio と最新バージョンの Visual Studio の両方がコンピュータにインストールされている場合は、同じコマンド ウィンドウから異なるバージョンの vsvars32.bat または vcvars32.bat を実行しないでください。 VSVARS32.BAT を実行するには コマンド プロンプトで、Visual Studio をインストールしたディレクトリの Common7\Tools サブディレクトリに移動します。 「VSVARS32」と入力して VSVARS32.bat を実行します。 注意 VSVARS32.bat はコンピュータごとに異なる可能性があります。VSVARS32.bat ファイルが見つからない場合や破損している場合でも、別のコンピュータの VSVARS32.bat ファイルと置き換えないでください。その場合は、セットアップ プログラムを再実行してファイルを置き換えてください。

  • コマンドライン

    コマンドについてご質問です。 テスト問題集をやっていたのですが、わからないところがあったので教えてください。 1]カレントディレクトリを1つ上のディレクトリに変更するコマンドを示せ。 ただ単に答えは、cdですか。 2]カレントディレクトリにあるfile1を2つ上位のディレクトリへ移動するコマンドを示せ。 これもただ単に、cdですか お願いします。