Итак, у вас есть два разных преобразования для двух элементов массива , не так ли?Так что вам просто нужно сопоставить каждое имя файла с соответствующим преобразованием, верно?
Что-то вроде этого, возможно?
set "conv[1]=ES"
set "conv[2]=DE"
for /l %%H in (1,1,2) do (
for %%c in (!conv[%%H]!) do set "newName[%%H]=!fName[%%H]:_EN_=_%%c_!"
)
Я предлагаю вам прочитать этот ответ .
РЕДАКТИРОВАТЬ : Добавлен новый метод
Этот код точно такой же , что и код в вашем опубликованном ответе:
@echo off
setlocal EnableDelayedExpansion
for %%a in (*.xml) do (
set "fName=%%a"
for %%c in (ES DE PL) do (
copy "%%a" "!fName:_EN_=_%%c_!"
)
)
Сравнение вашего кода с этим:
- Вам действительно не нужен массив имен файлов.Если вы создаете массив для однократной обработки его элементов без дальнейшей обработки, то вы тратите впустую пространство, занимаемое массивом.Вы можете сделать то же самое, используя отдельную переменную имени файла.
- Кроме того, вам не нужен массив преобразований.Если вы просто хотите повторить команду с несколькими преобразованиями, тогда гораздо проще использовать список преобразований.
- Не рекомендуется использовать специальные символы в качестве заменяемых параметров FOR (где в документации указана буква ).Пакетные файлы по своей сути зашифрованы, поэтому нет необходимости включать дополнительные сложности ...
- Если вы просто хотите обработать все файлы (без их переименования), тогда проще использоватьобычная команда
for
вместо for /F
команды 'dir /B'
.Вторая форма требует выполнения дополнительной копии программы cmd.exe
и создания временного файла на диске ... - Если переменная
newfName
(массив) используется только для выполнения команды copy
вследующая строка, то такая переменная (опять же) пустая трата пространства.Вы можете создать новое имя в самой команде copy
.