目次
バッチファイルがある場所のフォルダ名を取得する
バッチファイルを作成していると、そのバッチファイルがある場所のフォルダ名が必要になるときがあります。バッチコマンドには、以下のように実行しているバッチファイルの情報が格納されている変数が用意されています。
例えば、
%~d0 -> ドライブ名(例:C:)
%~p0 -> ドライブ以降のフォルダ名(例:\Users\tanaka\Desktop\バッチ\)
などです(※これらの変数については「パス名から自在に文字列を切り取る -やりたいことから検索-」で詳しく説明しています。)。
しかし、「C:\Users\tanaka\Desktop\folder\」という場所にいて、直近のフォルダ名「folder」だけを直接取得するコマンドは存在せず、自分でプログラムを書く必要があります。
以下が直近のフォルダ名「folder」だけを直接取得するバッチファイルです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
@echo off for /f "tokens=1-7 delims=\" %%a in ('echo %~dp0') do ( set drive=%%a set folder1=%%b set folder2=%%c set folder3=%%d set folder4=%%e set folder5=%%f set folder6=%%g ) echo ドライブ :%drive% echo フォルダ1:%folder1% echo フォルダ2:%folder2% echo フォルダ3:%folder3% echo フォルダ4:%folder4% echo フォルダ5:%folder5% echo フォルダ6:%folder6% |
「C:\Users\ide\Desktop\バッチ\」という場所でバッチファイルを実行していたとすれば、以下の結果を得ることができます。
変数「drive」には、ドライブ名が格納され、変数「folder1」から「folder6」にはドライブに近い順にフォルダ名が格納されています。
3行目からの「for」では、「echo %~dp0」で出力される文字列「C:\Users\ide\Desktop\バッチ\」を「\」を区切り文字としドライブ名・フォルダ名に分割して、drive,とfolder1からfolder6にそれぞれ代入しています。(※「for」コマンドについては、「for(繰り返し) -コマンド別解説-」で詳しく解説していますのでそちらも参考にして下さい。)
このようにすれば、バッチファイルが今いる場所のフォルダ名を「%folder4%」で取り出すことができます。
なお、上記のプログラムはドライブに近い順に6つのフォルダ名までしか対応していませんが、
1 2 3 4 5 6 7 8 9 10 11 |
for /f "tokens=1-9 delims=\" %%a in ('echo %~dp0') do ( set drive=%%a set folder1=%%b set folder2=%%c set folder3=%%d set folder4=%%e set folder5=%%f set folder6=%%g set folder7=%%h set folder8=%%i ) |
とすれば、8つのフォルダまで対応できます。用途によって必要なフォルダ数に対応できるよう編集して下さい。
以下は、10つのフォルダまで対応したバッチファイルを実行した結果です。
だた、もっといい方法がありそうな気もしますが…
「folder」を取得するなら、
現在のフォルダの%CD%の値から、
一つ上のフォルダの%CD%の値を消せば、
取得できるのでは?
1つ上のフォルダ名のみ取得したいなら、
1.現在のパスを取得する。
2.1つ上のフォルダに移動する。
3.その場所のパスを取得する。
4.1で取得したパスから、3で取得したパスを消す。
で、取得できると思いますよ。
@echo off
echo %~dp0
set para=%~dp0
:loop
call :GetPathName %para%
if “%ret2%”==”” (
goto :loopend
)
set para=%ret2%
goto :loop
:loopend
echo %ret1%
pause
exit /b
:GetPathName
for /f “tokens=1* delims=\” %%i in (“%1”) do (
set ret1=%%i
set ret2=%%j
)
exit /b