Установка переменной путем обрезки содержимого другой переменной - PullRequest
0 голосов
/ 22 октября 2018

У меня проблема, мне нужен код как в заголовке.Цель сценария: мне нужно скопировать файл с другим языковым кодом, например, XXX_x_xYYY_EN_xx в XXX_x_xYYY_ES_xx и XXX_x_xYYY_DE_xx.Пока у меня есть это, но это не работает:

setlocal enableDelayedExpansion
for /l %%H in (1,1,2) do (
set endf[%%H]=!fName[%%H]:*_EN_=!
set trim[%%H]=_EN_!endf[%%H]!
set beginf[%%H]=!fName[%%H]:%trim[%%H]%=!
)

fName установлено elswere, его что-то вроде этого fName [1] = XXX_x_xYYY_EN_xx fName [2] = XXXXX_x_xYYYY_EN_x Все работает, кроме set beginf (выплевывает "beginf [1] = fName [1]: =" ), япопробовал мириады из % nad ! комбо.Забавно, но в этом случае это работает (другой скрипт, та же кукла, но работает только для одного файла в каталоге, я хотел бы сделать его более универсальным):

set beginf=!NAME:%langcode%=!

help :) спасибо!

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Я нашел решение :) Полный скрипт с подсчетом файлов ниже:

@echo off
setlocal enableDelayedExpansion
set /a count=0
for /f %%# in ('dir *.xml /b') do (
    set /a count+=1
    set fName[!count!]=%%~xn#
)

set "conv[1]=ES"
set "conv[2]=DE"
set "conv[3]=PL"

for /l %%H in (1,1,!count!) do (
    for /l %%G in (1,1,3) do (
        for %%c in (!conv[%%G]!) do (
            set "newfName[%%G]=!fName[%%H]:_EN_=_%%c_!"
            copy !fName[%%H]! !newfName[%%G]!
        )
    )   
)

уточнение циклов:

для / l %% H - циклы черезМассив fName

для / l %% G - циклы по массиву таблицы lang (conv)

для %% c - объединение вышеуказанных циклови копировать файлы с измененными именами

спасибо @Aacini за ваш вклад, он поставил меня на правильный путь:)

0 голосов
/ 22 октября 2018

Итак, у вас есть два разных преобразования для двух элементов массива , не так ли?Так что вам просто нужно сопоставить каждое имя файла с соответствующим преобразованием, верно?

Что-то вроде этого, возможно?

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...