このようなものが動作するはずです:
%oldname:~-8%
最後の 8 文字を抽出し、そこから%oldname%
新しいファイル名に追加します。
更新:外部プログラムでファイルを識別し、ファイル名でバッチスクリプトを呼び出すことができる場合
copyfile.cmd C:\path\to\myfile20130218
次のようなことができます。
set oldname=%~nx1
set newname=%~dp1some_other_file_%oldname:~-8%
copy "%~f1" "%newname%"
更新 2:フォルダーと形式がわかっている場合は、フォルダーを使用してスクリプトを呼び出すことができます
copyfile.cmd C:\folder
次のようにします。
@echo off
setlocal EnableDelayedExpansion
for /f %%f in (
'dir /b "%~f1" ^| findstr /r "myfile[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$"'
) do (
set oldname=%~f1\%%f
set newname=%~f1\my_other_name_!oldname:~-8!
copy "!oldname!" "!newname!"
)
endlocal
編集:スクリプトの内訳。
setlocal EnableDelayedExpansion
ループおよび条件内での変数展開を有効にします。
for /f %%f in ('...')
一重引用符の間でコマンドを実行し、そのコマンドの出力をループします。
dir /b "%~f1"
指定されたディレクトリの内容を一覧表示し%~f1
ます (スクリプトに渡された最初の引数のフル パスに展開されます)。簡易モード (ヘッダーなし、要約なし)。
findstr /r "myfile[0-9]...[0-9]$"
部分文字列「myfile」で終わり、その後に 8 桁の数字が続く文字列の入力をフィルタリングします。パイプの前のサーカムフレックス ( ^|
) は、パイプをエスケープします。そうしないと、コマンドよりも優先され、for
コマンドが事実上for
半分に分割され、無効なコマンド ラインが生成されるためです。
set oldname=%~f1\%%f
一致するファイルへのフル パスを変数に割り当てますoldname
。
set newname=%~f1\my_other_name_!oldname:~-8!
新しいファイル名へのフル パス ("my_other_name_" の後に からの末尾の 8 桁が続くoldname
) を変数に割り当てますnewname
。
copy "!oldname!" "!newname!"
これは説明しなくてもいいですよね?