バッチファイル内で%~dp0とすれば
ファイルが保存されているディレクトリを取得できます。
これを利用して環境変数に
set TEST=pushd %~dp0
とセットし、
%TEST%
と展開することによって
バッチファイルのディレクトリに移動しようとしたのですが、うまく行きませんでした。
ファイルが保存されている場所への移動手段をわかりやすくまとめたいです。
それ以外にも各バッチファイルの先頭で行う処理を共通化する目的があります。
以下のように第一引数として渡すやり方もあるのですが、
test.bat----
call common.bat %~dp0
common.bat----
pushd %~dp1
setlocal
共通化部分ではsetlocalを使うため、
別ファイルに分割してしまうと有効範囲が変更され都合が悪いのです。
何かうまい回避方法はありますでしょうか?
(そもそも環境変数内で%~dp0が展開されてくれれば済む話なのですが…)
No.4ベストアンサー
- 回答日時:
なんとなくやりたいことがわかりました。
バッチ起動前に環境変数に以下のようにセットしておき
D:\>set x=pushd %~dp0^&setlocal
以下のようなバッチで実行したらどうでしょうか。
call %x%
set x=delete
call %x% で再評価している状況です。setlocalも効いているので、バッチ終了後環境変数xは元に戻っているはずです。
callはバッチファイルの呼び出しにしか使えないと思ってましたが、
こういうやりかたもあるんですね。
ユーザー環境変数に
pushd %~dp0^&setlocal
とセットしておいて
call %x%での呼び出しでやりたいことができるようになりました。
大変助かりました。
ありがとうございました。
No.3
- 回答日時:
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とは別の呼び出し方法は見つけられませんでした。
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:\>
------------------------------
この回答への補足
コマンドプロンプトで環境変数を設定した場合はうまくいくようです。
こちらでテストしたときはユーザー環境変数にセットしていました。
あらためて確認しましたが
%x%
としても
pushd %~dp0
がそのまま流れ、
環境変数の展開は行われませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) Windowsのバッチファイルについてご教示ください 5 2023/07/25 20:23
- 一眼レフカメラ 「Imaging Edge」を手動起動せず、ARWファイルを最高画質JPEGへ変換する方法は? 2 2022/08/05 11:38
- Windows 10 バッチファイルの記述法とルールについてアドバイスをお願いいたします。 1 2022/04/13 10:50
- ネットワーク 通信量を見たい 3 2023/03/01 07:47
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- Visual Basic(VBA) マクロVBA 1シートをまとめる 閉じ方 初心者 SOS! 1 2022/06/17 14:54
- デスクトップパソコン パソコンが重くなった 34 2022/06/14 19:41
- Visual Basic(VBA) ExcelのVBAコードについて教えてください。 2 2023/05/23 16:28
- Windows 10 パスを通す 1 2022/09/10 20:01
- ルーター・ネットワーク機器 通信量や通信量による影響を計算し想定できますか 3 2023/01/13 09:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッチファイルを実行後、終了...
-
リモートデスクトップの取り合...
-
Windows10のタスクスケジューラ...
-
batファイルを実行してコマンド...
-
DHCP設定バッチnetshコマンドに...
-
バッチでEnterを認識させ...
-
コマンドの結果を変数に入れたい
-
Windowsコマンドプロンプトで環...
-
oracleのimp-00002エラーについて
-
コマンドプロンプトで最新のフ...
-
バッチ実行を意図的に失敗させ...
-
WMICでリモートでバッチが実行...
-
WinSCPがタスクスケジューラで...
-
batファイルで、call使っても戻...
-
バッチファイルで自身の名前を...
-
バッチプログラムについて(編...
-
Wimで第2のWindowsのPGを起動...
-
batが実行できない
-
名前解決をバッチ処理で行うこ...
-
バッチのFOR及びIF文
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Windows10のタスクスケジューラ...
-
batファイルで、call使っても戻...
-
バッチファイルを実行後、終了...
-
リモートデスクトップの取り合...
-
DHCP設定バッチnetshコマンドに...
-
バッチプログラムについて(編...
-
バッチでEnterを認識させ...
-
バッチ実行を意図的に失敗させ...
-
DOSコマンドのforで空白行をス...
-
batファイルを実行してコマンド...
-
oracleのimp-00002エラーについて
-
コマンドの結果を変数に入れたい
-
バッチファイルを常に管理者権...
-
バッチ実行時にバッチのファイ...
-
バッチファイルでPC情報を取得する
-
batが実行できない
-
bat実行中に引数1の内容を変更...
-
WMICでリモートでバッチが実行...
-
実行結果を戻り値で取得したい
-
ログオンユーザを簡単に切り替え
おすすめ情報