Переименовать файлы из списка, но удалить использованные строки? - PullRequest
0 голосов
/ 20 сентября 2019

Я нашел это из другой ветки.Все, что он делает, это переименовывает файлы с именами из списка.Однако это не удаляет автоматически используемые имена.Можно ли заставить это сделать это?

SETLOCAL ENABLEDELAYEDEXPANSION

rem Load the list of new filenames
set i=0
for /F "delims=" %%a in (names.txt) do (
   set /A i+=1
   set "newname[!i!]=%%a"
)
rem Do the rename:
set i=0
for /F "delims=" %%a in ('dir /b /o:n *.doc') do (
   set /A i+=1
   for %%i in (!i!) do ren "%%a" "!newname[%%i]!"
)

1 Ответ

0 голосов
/ 22 сентября 2019

Вот расширенный пакетный файл, который удаляет все имена файлов из names.txt, используемые при переименовании файлов.

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "NamesListFile=names.txt"

rem Does the file with the list of new file names not exist?
if not exist "%NamesListFile%" goto EndBatch

rem Delete in local environment all environment variables
rem of which name starts with the string "newname[".
for /F "delims==" %%I in ('set newname[ 2^>nul') do set "%%I="

rem Load the list of new file names and assign them to environment variables.
set "NameIndex=0"
for /F "usebackq eol=| delims=" %%I in ("%NamesListFile%") do (
    set /A NameIndex+=1
    set "newname[!NameIndex!]=%%I"
)

rem Do the file renames as long as there is a new file name available in list.
set "NamesCount=%NameIndex%"
set "NameIndex=0"
set "RenameCount=0"
for /F "eol=| delims=" %%I in ('dir /B /O:N *.doc 2^>nul') do (
    set /A NameIndex+=1
    for %%J in (!NameIndex!) do (
        if defined newname[%%J] (
            ren "%%I" "!newname[%%J]!"
            set /A RenameCount+=1
        ) else goto RebuildList
    )
)

:RebuildList
rem Was no file found to rename?
if %RenameCount% == 0 goto EndBatch
rem Were all new names used to rename files?
if %RenameCount% == %NamesCount% (
    del "%NamesListFile%"
    goto EndBatch
)
rem Create a new file names list with used file names removed.
set /A RenameCount+=1
(for /L %%I in (%RenameCount%,1,%NamesCount%) do echo !newname[%%I]!)>"%NamesListFile%"

:EndBatch
endlocal

Ограничения этого пакетного файла:

  1. Это неработать с именами файлов, содержащими одно или несколько !.
  2. . Он не проверяет, было ли успешным каждое переименование файлов.

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

  • del /?
  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • rem /?
  • ren /?
  • set /?
  • setlocal /?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...