コマンドプロンプト - ディレクトリパスから最下のディレクトリ名を取得する。

"C:\Document and Setting/aaaa/workspace\

というディレクトリパスがあったとき、"workspace" だけを取得したい。
例えばバッチファイルでプロジェクトファイル名にそのディレクトリの名前をつけるときなどに使えるはず。


set CDN="C:\Document and Setting/aaaa/workspace\"

set CDN=%CDN:"=%
set CDN=%CDN:/=\%
if "%CDN:~-1%"=="\" (set CDN=%CDN:~0,-1%)

:loop_CDN
set CDN=%CDN:*\=%
if not "%CDN:*\=%"=="%CDN%" (goto loop_CDN)

echo %CDN%

workspace

例えば、以下のようなバッチファイルではエラーになる。

set CDN="C:\Document and Setting/aaaa/workspace\"
if "%CDN%"=="%CDN%" ( echo "ok" )

あらかじめダブルクォテーションを置換で削除する。その理由は この辺り
次にWindowsのパスは必ず \ か / で区切られるので、まず \ で統一。
また、パスの最後に\があったりすると都合が悪いのでここで切り捨てる。


後は \ の前にある文字列を置換処理で削除していく。
置換えができなければ、必ず置換え前の文字列と同じになるので、それを頼りにループ。


set /? より

環境変数の置換は、次のように拡張されます:

%PATH:文字列1=文字列2%

は、PATH 環境変数を展開し、その結果に含まれるすべての "文字列1" を"文字列2" に置き換えます。
"文字列2" に空の文字列を指定すると、展開された出力からすべての "文字列1" を削除することができます。
"文字列1"をアスタリスクで始め、展開された出力の先頭から、文字列1 の残りの部分が最初に現れるまでのすべてを一致させることもできます。

ループしてるのは、ワイルドカード文字が最短でしか処理してくれないため。
正規表現の便利さがよくわかるry


でもこんなめんどくさいことしなくても、1行でsetできそうな気がする。
調べてすぐ見つからなかったので作ったほうが早いと思い書いたけども。


調べて出た他の置換え方法はこれよりめんどくさい事をしているところが多かった。
おそらく、バージョンによっては環境変数の文字列置換が機能しないものもあるのかもしれない。