2016-03-22 2 views
2

Мне нужно переименовать все эти файлы в 6-значный номер детали (306391) на третьей строке.Разбор и переименование текстовых файлов

В настоящее время у меня есть:

setlocal enabledelayedexpansion 

set first=1 

for /f "skip=3 delims= " %%a in (Name.txt) do ( 

    if !first! ==1 (

    set first=0 

echo %%a > out.txt 
ren Name.txt %%a.txt 

) 
) 

, который находит 6-значный номер детали и переименовывает файл на правильное имя. Но ломается, если я использую * .txt вместо фактического имени .txt-файла. Мне нужно, чтобы он работал для всех .txt-файлов в каталоге.

+0

Так в основном для% % I in (* .txt) do ( for/f "skip = 3 delims =" %% a in ("%% ~ fI") do ( if! First! == 1 ( set first = 0 ren "%% ~ FI" %% a.txt Кажется, что я не делаю никаких файлов для меня. – Amk2539

+2

Почти. При дальнейшем осмотре ваш скрипт нуждался в других трюках. Я перевел свой комментарий на ответ. Отличный первый вопрос, кстати! Это освежает, когда новый участник фактически отправляет код, а не говорит: «Напишите сценарий для меня. Это то, что мне нужно, чтобы это делать». Рад, что вы этого не сделали. ':)' – rojo

ответ

2

Окружайте свою петлю for /f еще одним контуром for, затем укажите переменную внешнего контура в команде ren. Вы также можете устранить необходимость в замедленном расширении, используя if defined для булевых проверок. Я добавил и другие хитрости. Просто спросите, хотите ли вы детали.

@echo off 
setlocal 

for %%I in (*.txt) do (

    set first= 

    for /f "usebackq skip=3" %%a in ("%%~fI") do ( 

     if not defined first (

      set first=1 

      echo %%~nxI ^> %%a.txt 
      rem // uncomment this when you're satisfied that it works correctly 
      rem // ren "%%~fI" "%%a.txt" 

     ) 
    ) 
) 
+0

Можете ли вы подробнее остановиться на использовании «%% ~ fI» и %% ~ nxI ^> Я получаю за собой логику, но не понимаю, как это работает. – Amk2539

+0

'%% ~ fI' означает развернуть' %% I' на свой полный диск: \\ путь \\ до \\ filename.txt'. Это не обязательно, но это упростит, если вы решите, что в будущем вы захотите сделать ваш скрипт рекурсивным (изменив первый цикл 'for' на' for/R'). Символ '^>' просто означает эхо буквенный символ '>' на консоли, а не перенаправление вывода в файл как '>' обычно. Каретка - это символ побега. – rojo

+0

Каково использование %% ~ nxI? Nevermind, я понял это. – Amk2539

1

Этот метод должен работать быстрее, особенно если файлы большие, потому что только 4 строки каждого файла считываются (вместо целого файла):

@echo off 
setlocal EnableDelayedExpansion 

rem Process all .txt files 
for %%f in (*.txt) do (

    rem Read the 4th line 
    (for /L %%i in (1,1,4) do set /P "line4=") < "%%f" 

    rem Rename the file 
    for /F %%a in ("!line4!") do ECHO ren "%%f" "%%a.txt" 

) 
+0

Я думаю, что это будет четвертая строка, которую нужно прочитать. Он пропускает 3. – rojo

+0

@rojo: Вы правы! Исправлено (но OP сказал «на третьей строке») ... – Aacini

Смежные вопросы