• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:コマンドライン引数の展開について)

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

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

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

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

専門家に質問してみよう