アプリ版:「スタンプのみでお礼する」機能のリリースについて

バッチファイル内で%~dp0とすれば
ファイルが保存されているディレクトリを取得できます。

これを利用して環境変数に
set TEST=pushd %~dp0
とセットし、
%TEST%
と展開することによって
バッチファイルのディレクトリに移動しようとしたのですが、うまく行きませんでした。

ファイルが保存されている場所への移動手段をわかりやすくまとめたいです。
それ以外にも各バッチファイルの先頭で行う処理を共通化する目的があります。

以下のように第一引数として渡すやり方もあるのですが、

test.bat----
call common.bat %~dp0

common.bat----
pushd %~dp1
setlocal

共通化部分ではsetlocalを使うため、
別ファイルに分割してしまうと有効範囲が変更され都合が悪いのです。


何かうまい回避方法はありますでしょうか?
(そもそも環境変数内で%~dp0が展開されてくれれば済む話なのですが…)

A 回答 (4件)

なんとなくやりたいことがわかりました。



バッチ起動前に環境変数に以下のようにセットしておき

D:\>set x=pushd %~dp0^&setlocal

以下のようなバッチで実行したらどうでしょうか。
call %x%
set x=delete

call %x% で再評価している状況です。setlocalも効いているので、バッチ終了後環境変数xは元に戻っているはずです。
    • good
    • 0
この回答へのお礼

callはバッチファイルの呼び出しにしか使えないと思ってましたが、
こういうやりかたもあるんですね。

ユーザー環境変数に
pushd %~dp0^&setlocal
とセットしておいて

call %x%での呼び出しでやりたいことができるようになりました。
大変助かりました。
ありがとうございました。

お礼日時:2011/01/08 19:38

No.2 です。


バッチファイル内での話ではなく、コマンドプロンプト上での話のようですね。

> こちらでテストしたときはユーザー環境変数にセットしていました。
> あらためて確認しましたが
>
> %x%
> としても
> pushd %~dp0
> がそのまま流れ、
> 環境変数の展開は行われませんでした。

ユーザ環境変数というのは、システムのプロパティで設定する環境変数のことですか。
ここに、%~dp0 を書いてもなにも展開されませんよ。
%~dp0 の解釈を間違えられていると思います。
%0 や %1 などが意味を持つ(何かの値に展開される)のはバッチファイル内に記述して実行したときです。
%0 はバッチ内に記述されたときその実行したバッチ自身を示します。コマンドライン上で %~dp0 としても対象となるバッチファイルがどれなのかPCにはわかりませんよね。

>ファイルが保存されている場所への移動手段をわかりやすくまとめたいです。

ファイルが保存されてる場所が複数ある場合はどうしたいのですか?
具体的な例があると回避方法を提示できるかもしれませんね。

この回答への補足

>%0 や %1 などが意味を持つ(何かの値に展開される)のはバッチファイル内に記述して実行したときです。

実際に展開されるのはバッチを実行したときですが、
ユーザー環境変数に登録している段階ではあくまで文字列です。

ですから環境変数を展開した後、
再帰的にコマンド引数の展開を行ってくれると思ったのですが、
どうも無理のようですね。

環境変数中の環境変数はWindowsのバージョンによって展開順が違ったりするので、
あまり考えて作られていないのかもしれません。


やりたいことは
setlocalとcd%~dp0
です。

init.bat

setlocal
cd%~dp0
と書くか、
ユーザー環境変数に
setlocal&&cd%~dp0
とセットして、それがこちらの考えたとおりに展開されればOKのはずです。
ですが別ファイルに分ける方法ですとsetlocalの有効範囲が
init.bat内で終わってしまうため、呼び出し元のバッチファイルへの影響させることができません。

つまり親のバッチファイルからinit.batをインライン展開的に呼び出すことができればよいのです。
ですがcallとは別の呼び出し方法は見つけられませんでした。

補足日時:2011/01/08 14:20
    • good
    • 0

こんにちは



>バッチファイルのディレクトリに移動しようとしたのですが、うまく行きませんでした。

うまくいかないというのは、具体的にどううまくいかないのでしょうか。

当方で以下のように試してみましたが、ちゃんとバッチファイルが配置されているディレクトリに移動されましたよ。
(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:\>
------------------------------

この回答への補足

コマンドプロンプトで環境変数を設定した場合はうまくいくようです。

こちらでテストしたときはユーザー環境変数にセットしていました。
あらためて確認しましたが

%x%
としても
pushd %~dp0
がそのまま流れ、
環境変数の展開は行われませんでした。

補足日時:2011/01/08 11:32
    • good
    • 0

単純に



SET HOGE_DIR=%~dp0



pushd %HOGE_DIR%

ではダメなのでしょうか?

この回答への補足

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

環境変数の文字列
pushd %~dp0
がそのまま流れてしまいます。

補足日時:2011/01/08 11:33
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!