Chapter 07

部分文字列の取り出し(例:パス末尾の余分な の削除)

zetamatta
zetamatta
2020.10.27に更新
このチャプターの目次

次のように変数から部分文字列を取り出すことができます。ただし、こちらは「%%~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 と併用すればディレクトリ名末尾の不要な \ を削除することができますが、ルートディレクトリなど削除してはいけない \ の削除は回避できるところがポイントです(ただし、実際のディスクアクセスが発生する)