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

1950
Philip

У меня запущена следующая программа,

@echo off cls set /p "filename=type file name>" setlocal enabledelayedexpansion for /r E:\ %%a in (*) do if "%%~nxa"=="%filename%" ( echo %%~dpnxa >>path.txt ) 

У меня есть выходной файл, path.txtкоторый содержит,

E:\new.txt  E:\Redmi\new folder\new.txt E:\windows\new folder\new folder\new.txt 

Мне нравится иметь их в отдельных файлах, как,

E:\new.txt в path1.txt

E:\Redmi\new folder\new.txt в path2.txt

E:\windows\new folder\new folder\new.txt в path3.txt

1
Не используйте статическое значение для целевого файла, а вместо этого (переменную) переменную или разделите результат по разрыву строки. Seth 6 лет назад 0

2 ответа на вопрос

1
DavidPostill

Как разделить один текстовый файл на несколько текстовых файлов по строкам?

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

@echo off cls setlocal enabledelayedexpansion set /p "filename=type file name>" rem initialise counter to 1 set _count=1 for /r E:\ %%a in (*) do if "%%~nxa"=="%filename%" ( echo %%~dpnxa >>path!_count!.txt rem increment the counter set /a _count+=1 ) endlocal 

Заметки:

  • Я переместил setlocalстроку, чтобы остановить filenameутечку переменной в вызывающую cmdоболочку.

Дальнейшее чтение

  • Индекс AZ командной строки Windows CMD
  • Категоризованный список команд Windows CMD
  • enabledelayedexpansion - отложенное расширение приведет к тому, что переменные будут расширяться во время выполнения, а не во время анализа.
  • endlocal - завершить локализацию изменений среды в командном файле. Передача переменных из одного пакетного файла в другой.
  • for / r - перебирать файлы (подпапки Recurse).
  • set - отображать, устанавливать или удалять переменные окружения CMD. Изменения, сделанные с помощью SET, будут сохраняться только в течение текущего сеанса CMD.
  • setlocal - устанавливает параметры для контроля видимости переменных среды в командном файле.
Как написано, это не удастся, если какая-либо часть выходного пути содержит восклицательный знак. Решение требует включения и выключения отложенного расширения в цикле. Но я предпочитаю использовать FINDSTR / N в сочетании с FOR / F для получения номеров строк без необходимости отложенного расширения (см. [Мой ответ] (https://superuser.com/a/1272862/109090)). dbenham 6 лет назад 1
1
dbenham

У меня есть гораздо более простое и, возможно, более быстрое решение для вас:

  • Используйте DIR /S /B /A-Dвместо того, FOR /Rчтобы получить список путей. Это устраняет необходимость в IFутверждении.
  • Трубопровод к FINDSTR /N, совпадающий в начале строки, чтобы получить номер строки для использования в имени выходного файла.
  • Выполните всю вещь внутри, FOR /Fчтобы перебрать и проанализировать результаты в номер строки и путь каждой строки.
@echo off setlocal set /p "filename=type file name>" for /f "delims=: tokens=1*" %%A in ( 'dir /s /b /a-d "E:\%filename%" ^| findstr /n "^"' ) do >"path%%A.txt" echo %%B 

Если бы это был мой сценарий, я бы передавал целевое имя файла в качестве аргумента, а не запрашивал его:

@echo off for /f "delims=: tokens=1*" %%A in ( 'dir /s /b /a-d "E:\%~1" ^| findstr /n "^"' ) do >"path%%A.txt" echo %%B