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

У меня есть два файла:

old_names.txt
  oldname1
  oldname2 

new_names.txt 
  newname1
  newname2 

Я хотел бы найти в моей папке имена файлов , содержащие"old_names" и заменить строку "old_name" соответствующей "new_name".

for /f %%i in (old_names.txt) do (

 // get corresponding %%j new_name

 for /f %%a in ('dir /b /a-d *%%i*') do ren %%a %%j

)

Как я могу получить соответствующее новое имя?

Ответы [ 2 ]

0 голосов
/ 10 сентября 2018

Для вашей концепции пары файлов вам, по сути, нужно читать два файла построчно одновременно, если я правильно понимаю, что можно сделать, как показано в этом ответе . Итак, вот возможный код:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem // Define constants here:
set "_ROOT=D:\path\to\root_dir" & rem // (directory containing files to rename)
set "_FILE1=D:\path\to\old_names.txt"
set "_FILE2=D:\path\to\new_names.txt"

rem // Count number of lines of 1st file (2nd file is not checked):
for /F %%C in ('^< "%_FILE1%" find /C /V ""') do set "NUM1=%%C"

setlocal EnableDelayedExpansion
rem // Change into root directory:
cd /D "%_ROOT%" || exit /B 1
rem // Here input redirection is used to read both files simultaneously:
9< "!_FILE1!" 8< "!_FILE2!" (
     rem // Loop through the number of lines of the 1st file:
     for /L %%I in (1,1,%NUM1%) do (
         rem // Read a line from the 1st file:
         <&9 (set "LINE1=" & set /P "LINE1=")
         rem // Read a line from the 2nd file:
         <&8 (set "LINE2=" & set /P "LINE2=")
         rem /* Assign line strings to `for` variables to later avoid nested
         rem    delayedly expanded environment variables: */
         for /F "tokens=1,2 delims=| eol=|" %%I in ("!LINE1!|!LINE2!") do (
             rem // Get list of files matching the partial name:
             for /F "delims= eol=|" %%F in ('dir /B /A:-D "*!LINE1!*"') do (
                 endlocal
                 rem // Store current file name:
                 set "NAME=%%F"
                 setlocal EnableDelayedExpansion
                 rem // Do the actual sub-string replacement and rename file:
                 ECHO ren "!NAME!" "!NAME:%%I=%%J!"
             )
         )
     )
)
endlocal

endlocal
exit /B

После проверки правильности вывода удалите команду ECHO в верхнем регистре!

Это не работает, если любой из следующих символов встречается в двух именных файлах: =, !, ^; ~ не должен присутствовать в качестве первого символа в любой строке первого файла (старые имена).

0 голосов
/ 10 сентября 2018

Согласно моему комментарию. Создайте отдельный файл с именем names.txt и добавьте строки, которые вы хотите заменить, и на что вы хотите заменить его:

dummy replacement
dummy2 replacement2

тогда скрипт должен находиться в той же директории, или вы должны указать путь к файлам:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2" %%i in (names.txt) do (
  for /f %%a in ('dir /b /a-d ^| findstr "%%i"') do (
    set "oldname=%%a"
    set "newname=!oldname:%%i=%%j!"
    echo ren "!oldname!" "!newname!"
  )
)

или указав путь:

@echo off
setlocal enabledelayedexpansion
for /f "tokens=1,2" %%i in (names.txt) do (
  for /f %%a in ('dir /b /a-d "D:\PATH" ^| findstr "%%i"') do (
    set "oldname=%%a"
    set "newname=!oldname:%%i=%%j!"
    echo ren "!oldname!" "!newname!"
  )
)

Как только вы будете удовлетворены тем, что он печатает файлы для замены на экране, просто удалите echo из последней строки кода, чтобы фактически выполнить ren

...