2014-10-22 3 views
1

Searching, пытаясь и плачу я разработал код:Удалить все пустые строки из * .txt файлов в каталоге и вложенных папок в Windows,

For /R %%G IN (*.txt) do for /f "delims=" %%a in ('more +1 %%G ^| find /v ""') do (set line=%%~a echo !line!) > new\%%G 

ли кто-нибудь знает, почему это делает бесконечный цикл?

Что нужно сделать, это удалить пустые строки в каждом * .txt файле, который он обнаружил во всех подкаталогах, и поместить новый файл с тем же именем в «новую» папку. Я могу предоставить все «новые» папки, необходимые вручную.

+0

Знаете ли вы, что 'more + 1' удаляет первую строку каждого файла? (возможно, ваше намерение) – Stephan

+0

Я абсолютно не знаком с этой темой. Я этого не знал. Спасибо. – transfer1992

ответ

0

Я не уверен, что это заставит его зацикливаться навсегда, но вы пишете в NEW папку, которая находится в той же иерархии, которую вы читаете. Таким образом, он будет обрабатывать файлы, которые вы только что написали. Для этого вам понадобится фильтр.

Кроме того, я думаю, что для вашего имени выходного файла требуется %%~nxG, чтобы получить только имя файла и расширение, без пути.

Существует гораздо более простой способ вычеркнуть пустые строки. findstr . file вычеркнет пустые строки. findstr /rc:"[^ ] будет выделять пустые строки и строки, содержащие только пробелы.

@echo off 
setlocal 
set "outFolder=new" 
for %%F in ("%outfolder%\.") for /r %%G in (*.txt) do if "%%~dpG" neq "%%~fF\" findstr /rc:"[^ ]" "%%G" >"%%~fF\%%~nxG" 

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

for /r %%G in (*.txt) do findstr /rc:"[^ ]" "%%G" >"\distinctPath\%%~nxG" 

UPDATE

Одна вещи, которая может привести к вашему сценарию, чтобы повесить это что в канале MORE будет зависать, если файл имеет более 64k строк. Но я не понимаю, почему вы используете MORE в первую очередь.

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