文字列操作
バッチファイルでファイル名の加工やログの整形など、文字列を操作したい場面は多くあります。
バッチファイルには専用の文字列関数はありませんが、set コマンドの特殊な構文を使うことで、文字列の置換、切り出し(部分文字列の取得)、結合などの操作が可能です。
文字列の置換
変数内の特定の文字列を別の文字列に置き換えるには、以下の構文を使用します。
set 新変数=%変数:置換前=置換後%
使用例
@echo off
setlocal
set TEXT=Hello World
echo 元の文字列: %TEXT%
set TEXT=%TEXT:World=Japan%
echo 置換後: %TEXT%
endlocal
パス区切り文字の変換
set PATH_STR=C:\Users\user\Documents
set PATH_STR=%PATH_STR:\=/%
echo %PATH_STR%

中小企業経営者のためのRPA入門 RPA導入を成功させる方法

60分でわかる! AIエージェント 超 入門

コマンドラインの黒い画面が怖いんです。

知識・才能ゼロでもらく~に月10万円稼ぐ! よくわかるAI副業超入門
文字列の削除(空文字に置換)
set TEXT= Hello
set TEXT=%TEXT: =%
echo [%TEXT%]
文字列の置換は大文字・小文字を区別しません。%TEXT:hello=Hi% と記述した場合、Hello も HELLO
も hello もすべて置換されます。
* を使うと、指定した文字列より前をまとめて削除できます。
set TEXT=key=value
set VALUE=%TEXT:*==%
echo %VALUE%
置換前の文字列の先頭を = にすることはできません。また、% や !
を含む文字列は、通常の置換では正しく扱えない場合があります。
文字列の切り出し(部分文字列)
変数から特定の位置の文字列を切り出すには、以下の構文を使用します。
%変数:~開始位置,文字数%
| パラメータ | 説明 |
|---|---|
| 開始位置 | 0 から始まるインデックス |
| 文字数 | 取得する文字数(省略時は末尾まで) |
| 負の値 | 末尾からの位置を指定 |
使用例
@echo off
setlocal
set TEXT=ABCDEFGHIJ
rem 先頭から3文字を取得
echo %TEXT:~0,3%
rem 4文字目から3文字を取得(0始まりなので3を指定)
echo %TEXT:~3,3%
rem 先頭の2文字をスキップ
echo %TEXT:~2%
rem 末尾の3文字を取得
echo %TEXT:~-3%
rem 末尾の3文字を除く
echo %TEXT:~0,-3%
endlocal
ゼロ埋め(ゼロパディング)
数値を 3 桁にゼロ埋めする例です。
@echo off
setlocal enabledelayedexpansion
for /L %%i in (1,1,5) do (
set NUM=00%%i
set NUM=!NUM:~-3!
echo !NUM!
)
endlocal
ゼロ埋めのテクニックは、ファイル名の連番やログのフォーマットなどで頻繁に使用されます。set NUM=00%%i で先頭にゼロを付けた後、!NUM:~-3! で末尾 3 文字を取得することで 3
桁のゼロ埋めが実現できます。
文字列の結合
バッチファイルでは、変数を並べて記述するだけで文字列を結合できます。
@echo off
setlocal
set FIRST=Hello
set SECOND=World
set RESULT=%FIRST% %SECOND%
echo %RESULT%
endlocal
ループで文字列を蓄積する
@echo off
setlocal enabledelayedexpansion
set RESULT=
for %%f in (*.txt) do (
set RESULT=!RESULT! %%f
)
echo 見つかったファイル:%RESULT%
endlocal
文字列の長さを取得する
バッチファイルには文字列の長さを直接取得する機能がありません。以下のように 1 文字ずつ切り出し、空になるまで数えることで長さを求められます。
@echo off
setlocal enabledelayedexpansion
set TEXT=Hello World
set LEN=0
:LOOP
if not "!TEXT:~%LEN%,1!"=="" (
set /a LEN+=1
goto LOOP
)
echo 文字列: %TEXT%
echo 長さ: %LEN%
endlocal
切り出しの開始位置や文字数に変数を使う場合、%TEXT:~%LEN%,1% とは書けません。上の例のように
enabledelayedexpansion を有効にして !TEXT:~%LEN%,1!
と記述してください。詳しくは遅延展開の解説を参照してください。
文字列を扱うときの注意点
- 代入は
set "変数=値"の形式が安全です。set TEXT=abcのように行末に空白があると、その空白も値に含まれます。set "TEXT=abc"とクォートで囲むと、クォート外の空白は含まれません。 - 開始位置が文字列の長さを超えると、結果は空になります。
%TEXT:~-3%のように末尾から数える場合、文字列が 3 文字より短いときは全体が返されます。 - 大文字・小文字の変換機能はありません。 変換が必要な場合は、
forと置換を組み合わせる方法や PowerShell の利用を検討してください。 - 変数が未定義のとき、置換や切り出しは意図しない結果になります。 事前に
if defined 変数名で確認すると安全です。
ファイルパスの操作
バッチファイルでは、for の変数修飾子を使ってファイルパスの各部分を取得できます。
@echo off
set FILE=C:\Users\user\Documents\report.txt
for %%F in ("%FILE%") do (
echo フルパス: %%~fF
echo ドライブ: %%~dF
echo フォルダ: %%~pF
echo ファイル名: %%~nF
echo 拡張子: %%~xF
echo 名前+拡張子: %%~nxF
)
| 修飾子 | 説明 |
|---|---|
~f | フルパス |
~d | ドライブレター |
~p | パス(フォルダ部分) |
~n | ファイル名(拡張子なし) |
~x | 拡張子 |
~nx | ファイル名+拡張子 |
まとめ
| 操作 | 構文 |
|---|---|
| 文字列の置換 | %変数:置換前=置換後% |
| 文字列の切り出し | %変数:~開始位置,文字数% |
| 末尾から切り出し | %変数:~-文字数% |
| 文字列の結合 | set RESULT=%A%%B% |
| 指定文字より前を削除 | %変数:*文字=% |