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

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

@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

2 ответа

Решение

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

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

@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 - устанавливает параметры для контроля видимости переменных среды в командном файле.

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

  • использование 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
Другие вопросы по тегам