Как перевести пакетное переименование? - PullRequest
2 голосов
/ 24 октября 2019

Есть две папки, содержащие одинаковое количество файлов между ними. Я хотел бы применить имена из одного набора;к другому набору файлов в произвольном порядке. Унаследуйте имя, но сохраните расширение.

Входные файлы - .bmp. Выходные файлы - .ini (с символом шестеренки).

Пример:

 folder 1-  Flowers.bmp  ; folder 2- sample.ini
. To this:
 folder 1-  Flowers.bmp  ; folder 2- Flowers.ini

Тамбыло бы больше файлов, но равных. Все файлы .ini являются копиями. Таким образом, они могут иметь общее имя и пронумерованы, если это важно знать. Все они получают по одному имени из других файлов .bmp в другой папке.

Обычно у меня обе папки расположены на рабочем столе. Я уверен, что обе папки имеют одинаковое количество файлов между ними. Это было бы константой.

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

@ECHO OFF
SET "vers=%~1"
IF "%vers%" == "" SET /P "vers=Enter Vers: "
FOR %%F IN (file_XX_*.*) DO CALL :process "%%F"
GOTO :EOF

:process
SET "name=%~nx1"
SETLOCAL ENABLEDELAYEDEXPANSION
SET "name=!name:_XX_=_%vers%_!"
RENAME %1 "%name%"
ENDLOCAL

Надеясь наконец найти решение этой проблемы.

Ответы [ 2 ]

2 голосов
/ 24 октября 2019

Хорошо, вот немного длинная версия, но она гарантирует, что получает содержимое каждой папки.

Примечание Вы должны убедиться, что путь к обеим папкам правильно указан втретья и четвертая строка:

@echo off
setlocal enabledelayedexpansion
set "source=%userprofile%\Desktop\folder 1"
set "destination=%userprofile%\Desktop\folder 2"
set /a num=0
for %%a in ("%source%\*") do (
  set /a num+=1
  set "fr!num!m=%%~na"
)
set /a oldn=!num!
set /a num=0
for %%b in ("%destination%\*") do (
  set /a num+=1
  set "to!num!r!=%%~nxb"
  set "ext=%%~xb"
)
pushd "%destination%"
for /l %%i in (1,1,!oldn!) do ren "!to%%ir!" "!fr%%im!%ext%"
popd
pause

Вы можете удалить pause в нижней части скрипта, как только вы будете довольны выводом.

0 голосов
/ 24 октября 2019

Это не самый эффективный способ, но, учитывая ваш ограниченный пакетный опыт, я думаю, что понятный подход лучше, чем оптимизированный (с использованием массивоподобных переменных).

@echo off
setlocal enabledelayedexpansion

(for %%A in ("folder 1\*.bmp") do echo %%~nA)> "%temp%\names.txt"

<"%temp%\names.txt" (
for %%A in ("folder 2\*.ini") do (
  set /p "name="
  ECHO ren "%%A" "!name!.ini"
))

Первый for цикл создает список желаемых имен (от Folder 1). Модификатор %%~nA возвращает только n ame.

Второй for обрабатывает каждый файл в Folder 2 и получает имя из ранее созданного файла для каждого файла. Это зависит от того, что число файлов в обеих папках одинаковое , иначе вы можете получить нежелательные результаты.

Я отключил фактическую команду ren, просто повторив ее. Проверьте вывод и только когда вы удовлетворены, удалите ECHO.

...