Задача, которую вы пытаетесь выполнить, не так тривиальна, особенно когда вы не хотите оставлять последовательности разделителей, такие как точки, дефисы, подчеркивания и т. Д., После удаления частей строки в скобках.
Вот скрипт, который удаляет инициалы известных редакторов в скобках (предопределенные в файле списка initials.txt
в текущем каталоге) один за другим;если два соседних разделителя (например, .
, -
, _
, а также ,
, ;
, %
) остались бы позади, первый удаляется;если такого не было бы, вставляется тот, который определен первым (.
). Необязательно, потенциальный хвост, состоящий из известного суффикса (например, edited
или edit
, как определено в сценарии) и предшествующего разделителя, также удаляется. Так что это код, включая некоторые пояснительные rem
замечания:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "_ROOT=C:\documents" & rem // (root directory; `.` is current, `%~dp0.` is script's parent)
set "_DEST=C:\uniform" & rem // (destination directory)
set "_OVER=" & rem // (set this to `|` to overwrite existing files, or else to ``)
set "_LIST=initials.txt" & rem // (text file containing list of editors' initials, one per line)
set _MASKS="*.doc" "*.xls" & rem // (list of file patterns to process)
(set _LF=^
%= blank line =%
) & rem // (line-break)
set _PAREN=( )^%_LF%%_LF%[ ]^%_LF%%_LF%{ } & rem // (list of pairs of parentheses)
set _SEPAR=. - _ "," ";" %% & rem // (list of separators; do not use `=`, `~`, `!`, `^`)
set _TAILS="edited" "edit" & rem // (optional list of suffixes to remove; may be empty)
rem // Change into root (source) directory:
pushd "%_ROOT%" && (
rem // Iterate through all matching files:
for %%F in (%_MASKS%) do (
rem // Store full name of current file:
set "FILE=%%~F" & set "NAME=%%~nxF"
rem // Toggle delayed expansion to avoid trouble with `!`:
setlocal EnableDelayedExpansion
rem // Loop over the list of initials:
for /F "usebackq delims= eol=|" %%E in ("%_LIST%") do (
rem // Loop over trailing separators:
for %%J in (. !_SEPAR! "") do (
rem // Loop over leading separators:
for %%I in (!_SEPAR! "") do (
rem // Loop over pairs of parentheses:
for /F "tokens=1,2" %%K in ("!_PAREN!") do (
rem // Conditionally remove parenthesised text from file name:
if not "%%~J"=="" (
set "NAME=!NAME:%%~I%%K%%E%%L%%~J=%%~J!"
) else if not "%%~I"=="" (
set "NAME=!NAME:%%~I%%K%%E%%L%%~J=%%~I!"
) else if defined _SEPAR (
set "NAME=!NAME:%%~I%%K%%E%%L%%~J=%_SEPAR:~,1%!"
) else (
set "NAME=!NAME:%%~I%%K%%E%%L%%~J=.!"
)
)
)
)
)
rem // Process optional list of suffixes:
if defined _TAILS (
rem // Use `for /F` loop to split file name into base name and extension:
for /F "delims= eol=|" %%N in (""!NAME!"") do (
endlocal
rem // Store file name components:
set "NAME=%%~nxN" & set "EXT=%%~xN" & set "TEST=%%~nN|"
setlocal EnableDelayedExpansion
rem // Loop over suffixes:
for %%M in (!_TAILS!) do (
rem // Loop over separators:
for %%J in (!_SEPAR!) do (
rem // Remove found suffix from base name:
if not "!TEST!"=="!TEST:%%~J%%~M|=!" (
set "NAME=!TEST:%%~J%%~M|=!!EXT!"
)
)
)
)
)
rem // Actually copy file to destination with the newly built name:
if not exist "!_DEST!\!NAME!!_OVER!" (
ECHO copy /Y "!FILE!" "!_DEST!\!NAME!"
)
endlocal
)
popd
)
endlocal
exit /B
Настройте точное поведение в разделе Define constants here:
вверху.
После проверки вывода удалитекоманда ECHO
в верхнем регистре для фактического копирования файлов;чтобы подавить многочисленные строки 1 file(s) copied.
, возвращаемые командой copy
, замените вместо этого ECHO
на > nul
.