@ECHO Off
SETLOCAL
SET "sourcedir=U:\sourcedir"
:again
SET /a processed=0
FOR /f "delims=" %%a IN ( 'dir /b /a-d "%sourcedir%\*car*" ' ) DO (
rem for each filename matching mask...
FOR /f "tokens=1*delims=() " %%p IN ("%%a") DO IF "%%q" neq "" (
rem here for filenames containing at least 1 of the delimiter set to be eliminated
rem try to create a new filename containing not-banned characters
SET /a processed+=1
SET "changedthisname="
FOR %%r IN ("" _ $ x q j %random%) DO IF NOT DEFINED changedthisname (
IF NOT EXIST "%sourcedir%\%%p%%~r%%q" REN "%sourcedir%\%%a" "%%p%%~r%%q"&SET "changedthisname=y"
)
)
)
ECHO namechange attempts=%processed%%
IF %processed% gtr 0 GOTO again
GOTO :EOF
Вам необходимо изменить настройку sourcedir
в соответствии с вашими обстоятельствами. В листинге используется настройка, которая подходит для моей системы.
Поскольку вы, похоже, не заботитесь о новом имени файла, при условии, что оно не содержит символов, которые вы хотите удалить, возможно, это поможет вам.
Внешний цикл ищет любое имя файла, содержащее car
, и присваивает имя полностью %%a
.
Следующий цикл анализирует имя и разбивает его на две части - до и после любого из нежелательных символов (устанавливается в delims=
). Если в имени файла нет ни одного из нежелательных символов, то вторая часть имени файла в %%q
будет пустой, поэтому мы можем их игнорировать. В противном случае мы пытаемся заменить другие разрешенные символы на запрещенные. Я выбрал ""
(пустая строка - просто отбросить символы), _
, $
, x
, q
, j
(как они редки) или случайное число. changedthisname
отслеживает, был ли файл переименован, чтобы процесс не пытался выполнить несколько переименований одного и того же файла.
processed
подсчитывает имена файлов, которые содержали нежелательные символы на любом проходе, поэтому в конце прохода, если ничего не найдено, мы заканчиваем.
Таким образом, имя файла, например car error file (1).txt
, использующее ()[space]
в качестве разделителей для %%p
, может обработать имя до car$error file (1).txt
на первом проходе, car$error_file (1).txt
, car$error_filej1).txt
на третьем и car$error_filej19162.txt
на четвертом .
Хорошо, хорошо - раздел "изменение имени на" немного сложен и его можно убедить сделать car
+ случайным числом - но, эй, компьютеры сложны, и простым случайным числом будет - ну, совсем не весело.