このチャプターの目次
次のように変数から部分文字列を取り出すことができます。ただし、こちらは「%%~dpI」の時と違って「%変数名%」表現の時だけです。
- %変数名:~開始位置,終了位置% という構文が提供されている
- 終了位置を省略する時は %変数名:~開始位置%
- 位置は 0 スタートで、マイナスは末尾からの文字数とされている
- 細かいルールについては
SET /?
で確認できる
(例)
パス末尾の余分な \ を削除するには次のような文を書くことになります。
@echo off
set "TARGET=C:\Users\"
echo Before TARGET=%TARGET%
echo %TARGET%|findstr \\$ >nul && set "TARGET=%TARGET:~0,-1%"
echo After TARGET=%TARGET%
set "TARGET=C:\Windows"
echo Before TARGET=%TARGET%
echo %TARGET%|findstr \\$ >nul && set "TARGET=%TARGET:~0,-1%"
echo After TARGET=%TARGET%
Before TARGET=C:\Users\
After TARGET=C:\Users
Before TARGET=C:\Windows
After TARGET=C:\Windows
- この例だけに限っていうと、パイプ記号
|
の直前に空白を入れると機能しなくなるので、注意が必要です
余談
なお、部分文字列を使わない不要なバックスラッシュの削除方法として、 実際にそのディレクトリに移動してしまってから、カレントディレクトリを取得する という荒業もあります。
@echo off
echo ** CASE 1 **
set "TARGET=C:\Users\"
echo Before TARGET=%TARGET%
pushd "%TARGET%"
set "TARGET=%CD%"
popd
echo After TARGET=%TARGET%
echo ** CASE 2 **
set "TARGET=C:\"
echo Before TARGET=%TARGET%
pushd "%TARGET%"
set "TARGET=%CD%"
popd
echo After TARGET=%TARGET%
** CASE 1 **
Before TARGET=C:\Users\
After TARGET=C:\Users
** CASE 2 **
Before TARGET=C:\
After TARGET=C:\
%CD%
は見かけは環境変数ですが、実は現在のカレントディレクトリに置換される動的変数です。pushd/popd と併用すればディレクトリ名末尾の不要な \
を削除することができますが、ルートディレクトリなど削除してはいけない \
の削除は回避できるところがポイントです(ただし、実際のディスクアクセスが発生する)