Как переименовать и добавить инкрементный суффикс числа в нескольких файлах в Batch Script? - PullRequest
1 голос
/ 14 июля 2011

У меня 500 поступающих файлов, и мне нужно сначала проверить, существуют ли какие-либо файлы, затем переименовать их все, независимо от того, какое у них имя файла (файлы названы на другом языке).

Нет необходимости обрабатывать их в любом порядке.

Переименование:

1.  “¦X¼d¬f-20110703-¦+¦dñHÑ-ª-¦=¬¦.xls” 
2.  “¦X¼d¬f-20110707-¦+¡¦-+¡8.xls”
3.  “¦X¼d¬f-20110707-¦+¡¦ñj¦«.xls”
4.  “¦X¼d¬f-20110708-¦+¡¦¬M¼n.xls”
5.  “¦X¼d¬f-20110713-¦d¼O¼n¦hÑP.xls”
.
.
.
500

До:

“TWN_CH_INV_VISIT_FORM_01.xls”
“TWN_CH_INV_VISIT_FORM_02.xls”
“TWN_CH_INV_VISIT_FORM_03.xls”
“TWN_CH_INV_VISIT_FORM_04.xls”
“TWN_CH_INV_VISIT_FORM_05.xls”
.
.
.
“TWN_CH_INV_VISIT_FORM_500.xls”

Надеюсь, вы могли бы помочь мне в этом. Я пытался делать это неделями.

Ответы [ 2 ]

5 голосов
/ 14 июля 2011

простой FOR со счетом (SET /A) должен делать то, что вам нужно.

setlocal enabledelayedexpansion
SET /A COUNT=0
FOR %%A IN (*.xls) DO (
  SET /A COUNT+=1
  REN "%%A" "TWN_CH_INV_VIST_FORM_!COUNT!.xls"
)

См. HELP FOR и HELP SET

1 голос
/ 15 мая 2016

Это обманчиво сложный вопрос для решения.

У 5-летнего ответа PA есть несколько проблем.

1) Цикл FOR начинает итерацию без буферизации всего дерева каталогов, поэтомуон может переименовать файл, который уже был переименован.Я полагаю, что именно поэтому файл 7 отсутствует в комментарии r0mmel.

2) Отложенное расширение происходит после того, как раскрываются переменные, поэтому имя файла будет повреждено, и переименование будет неудачным, если имя содержит ! символ.

3) Переименование может завершиться неудачей, если уже существует файл TWN_CH_INV_VIST_FORM_n.xls с тем же номером.

Сначала я подумал, что могу решить проблему, используя следующее:

@echo off
for /f "delims=: tokens=1*" %%A in (
  'dir /b *.xls ^| findstr /n "^"'
) do ren "%%B" "TWN_CH_INV_VIST_FORM_%%A.xls.new"
ren *.txt.new *.

Я использую DIR / B, чтобы вывести список файлов, и канал, который приводит к FINDSTR, чтобы префиксировать каждое имя файла номером строки, за которым следует двоеточие.

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

Сначала я даю переименованным файлам .xls.new «расширение», на всякий случай, если ваш каталогуже есть файлы, которые соответствуют шаблону TWN_CH_INV_VIST_FORM_n.xls.Вы не хотите никаких коллизий имен.Затем последняя команда REN просто удаляет расширение .new, чтобы оставить желаемое .xls.

НО , я только что заметил, что в исходных именах файлов есть многостранных символов, которые могут включать юникод, которого нет в текущей кодовой странице.FOR / F не очень хорошо работает с юникодом.

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

Итак, пришло время отключить мою утилиту переименования регулярных выражений .Это чистый скрипт (гибридный пакет / JScript), который работает на любом компьютере с Windows начиная с XP.Он имеет встроенную функцию для добавления числа с приращением фиксированной ширины в новое имя и прекрасно работает с юникодом.Я все еще временно даю новому имени расширение «.xls.new», чтобы избежать любых конфликтов имен.

@echo off
call jren "^.*" "'TWN_CH_INV_VIST_FORM_'+$n+'.xls.new'" /j /npad 3 /fm *.xls
ren *.xls.new *.

Я решил дополнить увеличивающееся число до 3 цифр вместо 2, потому что ОП сказал, что может быть500 файлов.

Полная документация для JREN.BAT доступна из командной строки через jren /? или jren /??, если вы хотите вывести на экран вывод.

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