Как переименовать несколько папок, используя прогрессивный номер? - PullRequest
0 голосов
/ 04 января 2019

Я использую Windows 7 Ultimate. У меня есть много папок в каталоге, которые мне нужно переименовать с фиксированным базовым именем и прогрессивным числом от 1 до бесконечности.

Путь к папкам имеет место, а базовая папка D:\Programmi Installati.

Пример папок для переименования:

log_04-01-2019 15-15-11,51
log_03-01-2019 21-18-16,22
log_02-01-2019 6-21-17,34
log_01-01-2019 8-22-14,19
log_27-12-2018 14-23-18,28

Пример имен требуемых папок:

log_1
log_2
log_3
log_4
log_5

Номера папок для переименования могут быть большими, но структура такая же.

Ответы [ 3 ]

0 голосов
/ 04 января 2019

Код командного файла для задачи переименования этой папки:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "Counter=1"
for /F "delims=" %%I in ('dir "D:\Programmi Installati\log_*" /AD /B /ON 2^>nul') do ren "D:\Programmi Installati\%%I" "log_!Counter!" & set /A Counter+=1
endlocal
pause

Команда FOR выполняется с cmd.exe /C (точнее %ComSpec% /C) в отдельном командном процессе в фоновом режиме командной строки:

dir "D:\Programmi Installati\log_*" /AD /B 2>nul

DIR вывод для обработки STDOUT этого фонового командного процесса

  • только имена всех каталогов из-за опции /AD (атрибут directory)
  • в голом формате из-за опции /B без пути к папке
  • соответствует шаблону подстановки log_*
  • в указанном каталоге D:\Programmi Installati
  • заказывается по имени из-за опции /ON.

DIR выведет сообщение об ошибке для обработки STDERR , если не найдет ни одной записи каталога, соответствующей этим критериям. Это сообщение об ошибке перенаправляется на устройство NUL для его подавления.

Прочитайте статью Microsoft о Использование операторов перенаправления команд для объяснения 2>nul. Оператор перенаправления > должен быть экранирован с помощью символа вставки ^ в командной строке FOR , чтобы интерпретироваться как литеральный символ, когда интерпретатор команд Windows обрабатывает эту командную строку перед выполнением команды FOR , которая выполняет встроенную командную строку dir в отдельном командном процессе, запущенном в фоновом режиме.

FOR перехватывает все выходные строки для обработки STDOUT запущенного командного процесса и обрабатывает эти строки после завершения самого запуска cmd.exe. Для этой задачи переименования папок очень важно, чтобы FOR выполнялся со списком имен папок, захваченных перед переименованием папки, иначе записи каталога изменились бы, пока FOR обращается к ним. По этой причине for /D нельзя использовать в этом случае, поскольку for /D будет обрабатывать список записей каталога log_*, в то время как этот список изменяется при каждом успешном переименовании папки. Результатом будут каталоги, не переименованные или переименованные несколько раз, или даже бесконечный рабочий цикл в зависимости от файловой системы (NTFS или файловой системы FAT, такой как FAT32 или ExFAT).

FOR с параметром /F игнорирует пустые строки, которые здесь не встречаются. FOR игнорирует также строки, начинающиеся с точки с запятой, поскольку опция конца строки eol=; используется по умолчанию. Но все строки, выводимые DIR , начинаются с log_, и по этой причине определение конца строки по умолчанию можно сохранить для этой задачи.

FOR с параметром /F по умолчанию разделяет строку на подстроки, используя в качестве разделителей обычный пробел и горизонтальную табуляцию, и назначает только первую строку, разделенную пробелом / табуляцией, указанной переменной цикла. Такое поведение разделения строк здесь нежелательно, поскольку переменная цикла I должна содержать имя каталога со всеми пробелами. Поэтому delims= используется для определения пустого списка разделителей, чтобы отключить режим разделения строк.

На имя каталога, назначенное переменной цикла I, ссылается %%I, а полный путь не выводится DIR в качестве имени источника команды REN . Имя новой папки - log_ со значением переменной счетчика, на которое ссылается использование отложенное расширение переменной среды .

Переменная счетчика увеличивается на единицу с использованием простого арифметического выражения после того, как переименование каталога, независимо от того, переименование каталога прошло успешно, не удалось по различным причинам.

Команда PAUSE в конце добавлена ​​для просмотра сообщения об ошибке, выводимого командой REN , если переименование каталога завершилось неудачно. Ничего не выводится, кроме приглашения PAUSE для всех каталогов, которое может быть успешно переименовано.

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

  • dir /?
  • echo /?
  • endlocal /?
  • for /?
  • pause /?
  • ren /?
  • set /?
  • setlocal /?

См. Также одну строку с несколькими командами с использованием пакетного файла Windows для объяснения оператора &.

PS: я рекомендую использовать условно-бесплатный файловый менеджер Total Commander, который имеет встроенный инструмент многократного переименования для переименования файлов и папок для людей, не имеющих опыта программирования. Загрузите, установите и запустите Total Commander, перейдите в папку, содержащую все эти папки, нажмите Ctrl + A , чтобы выбрать папки, нажмите Ctrl + M , чтобы открыть окно инструмента многократного переименования, и остальное самоочевидно. Если вам все же нужна помощь, нажмите клавишу F1 , чтобы открыть страницу справки для инструмента переименования.

0 голосов
/ 04 января 2019

Скрипт powershell, который форматирует число с ведущими нулями в 3 места:

$iref = [ref]0 
Get-ChildItem 'D:\Programmi Installati\log_[0-9][0-9]-*' -Dir|
   Rename-Item -NewName {'log_{0:D3}' -f (++$iref.Value)}

Быть по теме, завернутым в строку / пакет cmd

powershell -NoP -C "$iref=[ref]0;Get-ChildItem 'D:\Programmi Installati\log_[0-9][0-9]-*' -Dir|Rename-Item -NewName {'log_{0:D3}' -f (++$iref.Value)}"

Пример результата:

log_001
log_002
log_003
log_004
log_005

Если начальных нулей не требуется, удалите часть :D3.

0 голосов
/ 04 января 2019

При условии, что вы не хотите сортировать по датам папок на основе log_04-01-2019 15-15-11,51 или 04-01-2019. Тогда нижнее решение будет работать. Здесь мы используем цикл FOR, чтобы получить каждое из имен папок, используя dir %folder% /S /b /AD и расширяя %%~nA для необработанных имен папок.

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

Rename.bat:

@ECHO OFF
@setlocal enabledelayedexpansion

Rem | Folder Path & CD To Location
Set "Folder=C:\Folder"
CD %Folder%

Rem | Get Raw File Name
Set "Number=1"
for /F "tokens=*" %%A in ('dir "log_*" /S /b /AD') do (

    Rem | Rename Folder || Raw Name - %%~n1
    rename "%%~nA" "log_!Number!"

    Rem | Add One To Number
    set /a "number+=1"

)

Goto :EOF

Для получения справки по любой из команд выполните следующее:

  • call /?
  • set /?
  • for /?
  • if /?
  • find /?
  • И так далее.
...