Вот простое решение для пакетного файла для этой задачи:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
for %%I in ("C:\Folders\* CHK#*") do call :ProcessFile "%%I"
endlocal
goto :EOF
:ProcessFile
set "FileName=%~nx1"
set "CheckSum=%FileName:* CHK#= CHK#%"
call set "FolderName=%%FileName:%CheckSum%=%%"
md "%~dp1%FolderName%" 2>nul
move /Y %1 "%~dp1%FolderName%"
goto :EOF
Строка после CHK#
не должна иметь знак равенства или один или несколько знаков процента.
ПодпрограммаProcessFile
присваивает при подстановке строки строковую часть, начиная с первого вхождения CHK#
до конца имени файла, переменной среды CheckSum
.
Еще одна подстановка строки используется для удаления строки контрольной суммы из файлаимя, чтобы получить имя папки.Эта командная строка дважды анализируется командным процессором Windows, так как команда call
заменяет при первом разборе %CheckSum%
текущее значение переменной среды CheckSum
и заменяет оба %%
только одним %
.При втором разборе обрабатываются оставшиеся set "FolderName=%FileName: CHK#123=%"
, в результате чего переменной окружения FolderName
присваивается строка FIRSTNAME LASTNAME
для первого примера имени файла.См. Также Как синтаксический анализ сценариев интерпретатора команд Windows (CMD.EXE)?
Чтобы понять используемые команды и понять, как они работают, откройте окно командной строки и выполните следующие команды:и внимательно прочитайте все справочные страницы, отображаемые для каждой команды.