У меня есть несколько файлов для переименования

Eg:
     ERJP00300029 3.13.jpg
     SRKP00100002 12.04.jpg
     ERJP01500001 ERJP12 10.5.jpg

Я хочу переименовать файл выше как

Eg:
    ERJP00300029.jpg
    SRKP00100002.jpg
    ERJP01500001.jpg

Как сохранить имя первой части в покое.

Я использовал приведенный ниже код, но не могу найти точное решение. Где я заблуждаюсь.

@ECHO ON

SETLOCAL ENABLEDELAYEDEXPANSION
SET SourceDir=F:\Ezhilarasan\Exibt\need_upload\ERHP\check
FOR /G "TOKENS=1-3 DELIMS=. " %%G IN ('DIR /B /A-D "%SourceDir%\*.jpg"') DO (
    SET "part1=%%~F" 
    SET "part2=%%~G" 
    SET "part3=%%~H"
    REN "!part1! \%SourceDir%!part2!.!part3!" "!part1!.!part3!"
)
GOTO EOF

2 ответа2

0

Ну, есть несколько вещей, которые происходят:

  1. Ваша система настроена на использование языка, отличного от английского?  В моей (основанной на английском языке) системе вы пытаетесь выполнить команду FOR /F , а не FOR /G
  2. Вы извлекаете три (1-3) токена, начиная с %%G , но затем используете %%F , %%G и %%H Ничего не помещается в %%F Либо измените оператор FOR чтобы он ссылался на %%F , либо измените тело цикла, чтобы использовать %%G , %%H и %%I Кроме …
  3. ... не делай этого.  Ваш подход ошибочен.  Подумайте о том, что значит иметь точку (.) И пробел в качестве разделителей.  Ваши имена файлов разбиваются на токены, как это:

                                         # 1 # 2 # 3 # 4 # 5 ERJP00300029 3.13.jpg → ERJP00300029 3 13 jpg SRKP00100002 12.04.jpg → SRKP00100002 12 04 jpg ERJP01500001 ERJP12 10.5.jpg → ERJP01500001 ERJP12 10 5 jpg

    так,

    • имя файла не всегда равно part1 part2.part3 ,
    • расширение не всегда третий токен, а, по сути,
    • для вашего примера имен файлов, это никогда не третий токен, и
    • это не всегда один и тот же номер токена.


    Мы должны вернуться к этому.

  4. Как вы думаете, что вы делаете с командой REN (RENAME)?  В частности, почему вы помещаете \%SourceDir% между part1 и part2?  Единственная надежда на выполнение этой работы - поместить %SourceDir%\ перед part1 .  И обратите внимание, что обратная косая черта (\) должна идти после %SourceDir% .
  5. Если это полный пакетный файл, вам не нужно делать ничего особенного в конце.  Пакетный файл завершится, когда достигнет конца.  Но, если это часть более крупной системы, вы можете захотеть иметь явную завершающую команду в конце.  Эта команда должна быть GOTO :EOF , а не GOTO EOF .

Не в кучу, но ваш подход к выводу из DIR и немедленному разбиванию его в токенах ошибочен.  Если посмотреть на имена ваших примеров, строка ERJP12 10.5 будет разбита на три токена :ERJP12 , 10 и 5 .  Но ERJP12.10.5 будет разбит на те же токены, как и ERJP12 10 5 и ERJP12.10 5 .  Вы не можете восстановить исходные (то есть, текущие, существующие) имена файлов из токенов; вам нужно захватить исходное имя файла без изменений, а затем разбить его.

Я не понимаю, почему вам нужно запустить DIR . Все, что вам нужно, это FOR %%F IN ("%SourceDir%\*.jpg") DO ; он даст вам только имена файлов (без подкаталогов), и, в отличие от вывода DIR , будет содержать имя исходного каталога (каталог, содержащий файлы).  Теперь, когда у нас есть полный текущий путь к файлу в %%F , мы можем начать разбивать его.  Теперь мы используем FOR /F Итак, возьмите часть файла п РРЭ %%F и вытащить маркер , который является первой частью одиночки.  Затем переименуйте исходный полный путь к первой части плюс напряжение e x .  Вот полный пакетный файл:

SET SourceDir=F:\Ezhilarasan\Exibt\need_upload\ERHP\check
FOR %%F IN ("%SourceDir%\*.jpg") DO (
    FOR /F "DELIMS=. " %%A IN ("%%~nF") DO (
        REN "%%F" "%%A%%~xF"
    )
)
0

Хотя я согласен с каждым из очень подробных объяснений Скотта
в этом особом случае простой

@Echo On
Pushd F:\Ezhilarasan\Exibt\need_upload\ERHP\check
FOR /F  %%G IN ('DIR /B /A-D "*.jpg"') DO REN "%%G*.jpg" %%G.jpg
PopD

сделал бы одинаково.
По умолчанию for /f "tokens=1 delims= " dir возвращает только файлы с ext jpg, поэтому мы можем использовать его буквально при переименовании.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .