2012年5月8日火曜日

Windows バッチファイルでカレントディレクトリを取得する

ようやく取得できた・・・ので、方法を記載しておきます。

@echo off
setlocal
REM バッチファイル実行パス取得(カレントディレクトリの場合、%CD%に変更)
SET STR="%~dp0"
if %STR%=="" exit

REM パス中の空白を#に変換
SET STR_NO_BLANK=%STR: =#%
REM パス区切り文字(\)を空白に変換
SET STR_TOKENS=%STR_NO_BLANK:\= %

REM 空白パスのためにつけていた二重引用符を削除(しないとforがうまくいかない)
for %%i in (%STR_TOKENS:"=%) do (
  SET TOKEN=%%i
)

REM 最終フォルダ=カレントディレクトリを取得(#にしていた空白を再変換)
echo %TOKEN:#= %

endlocal


※2012/05/14追記
jak-sanよりコメントを頂き、上記内容を修正すると共にもっと簡単な方法を追記します。

@echo off
setlocal

set x=%~dp0
REM パス末尾の\を除去し終端ディレクトリをファイル名のようにする(C:\hoge\ -> C:\hoge)
set x=%x:~0,-1%

REM ファイル名部分を取得する~nで末端ディレクトリを取得する
for /F "delims=" %%a in ('echo "%x%"') do echo %%~na

endlocal

え?~nとかってどういう意味?という場合下記のサイトを参考にしてみてください(jak-sanさんのサイトでなくてすみません・・・なかなか見つからなかったもので・・・)。

2 件のコメント:

  1. %~dp0で取得できるのはそのバッチのある場所のパスです。
    これはカレントディレクトリとは異なります。
    (偶然おなじときもありますが)

    カレントディレクトリはバッチが実行されているドライブの現在の作業中のディレクトリのことで%CD%で取得できます。

    また上記バッチだと最初に置換した空白が"#"のままのようです。

    ご希望のバッチがある場所のフォルダ名を取得でしたらこんな感じでいかがでしょうか?

    set x=%~dp0
    set x=%x:~0,-1%
    for /F "delims=" %%a in ('echo "%x%"') do echo %%~na


    じゃく
    http://homepage1.nifty.com/jak/batch/
    http://d.hatena.ne.jp/jak-san/

    返信削除
    返信
    1. コメント頂きありがとうございます。内容を修正し、また教えていただいた内容を追記しました。

      コメント部分は処理のメモを記載していますが、もし間違っていましたらお手数をおかけしますがご指摘お願いします。

      削除