Как посчитать количество строк в текстовом файле и сохранить значение в переменной с помощью пакетного скрипта? - PullRequest
47 голосов
/ 14 апреля 2011

Я хочу посчитать количество строк в текстовом файле, а затем значение должно быть сохранено в переменной среды. Команда для подсчета количества строк:

findstr /R /N "^" file.txt | find /C ":"

Я ответил на вопрос Как сохранить результат выражения команды в переменной с использованием сценариев bat? Тогда я попробовал,

set cmd="findstr /R /N "^" file.txt | find /C ":" "

Я получаю сообщение об ошибке,

FIND: Parameter format not correct

Как я могу избавиться от этой ошибки.

Ответы [ 14 ]

89 голосов
/ 08 мая 2014

Существует гораздо более простой способ, чем все эти другие методы.

find /v /c "" filename.ext

Очевидно, что пережиток прежних дней MS-DOS.Более подробная информация здесь: https://devblogs.microsoft.com/oldnewthing/20110825-00/?p=9803

Пример использования:

adb shell pm list packages | find /v /c ""

Если ваше устройство Android подключено к вашему ПК и на вашем пути установлен Android SDK, будет напечатано количествоприложения, установленные на вашем устройстве.

35 голосов
/ 14 апреля 2011

Вы можете использовать цикл FOR / F, чтобы назначить вывод переменной.

Я использую cmd-variable, поэтому нет необходимости экранировать канал или другие символы в cmd-строке, так как отложенное расширение передает строку «без изменений» в цикл FOR.

@echo off
cls
setlocal EnableDelayedExpansion
set "cmd=findstr /R /N "^^" file.txt | find /C ":""

for /f %%a in ('!cmd!') do set number=%%a
echo %number%
16 голосов
/ 11 апреля 2012

Вдохновленный предыдущими сообщениями, более короткий способ сделать это:

CMD.exe
C:\>FINDSTR /R /N "^.*$" file.txt | FIND /C ":"

Количество строк

Попробуй. Это работает в моей консоли.

РЕДАКТИРОВАНИЕ:

(знак "$" удален)

FINDSTR /R /N "^.*" file.txt | FIND /C ":"

$ уменьшает число на 1, поскольку принимает первую строку в качестве имени поля, а затем считает количество строк.

9 голосов
/ 28 февраля 2012

Попробуйте это:

@Echo off
Set _File=file.txt
Set /a _Lines=0
For /f %%j in ('Find "" /v /c ^< %_File%') Do Set /a _Lines=%%j
Echo %_File% has %_Lines% lines.

Устраняет лишние FindStr и не требует расширения.


- отредактировано для использования предложения перенаправления ChrisJJ. Удаление команды TYPE делает ее в три раза быстрее.

4 голосов
/ 08 апреля 2013

Я обычно использую что-то более подобное for /f %%a in (%_file%) do (set /a Lines+=1)

4 голосов
/ 03 декабря 2012

@ Тони: Вы даже можете избавиться от команды type %file%.

for /f "tokens=2 delims=:" %%a in ('find /c /v "" %_file%') do set /a _Lines=%%a

Для длинных файлов это должно быть еще быстрее.

3 голосов
/ 06 марта 2018

Вам не нужно использовать поиск.

@echo off
set /a counter=0
for /f %%a in (filename) do set /a counter+=1
echo Number of lines: %counter%

Это повторяет все строки в файле и увеличивает переменную счетчика на 1 для каждой строки.

3 голосов
/ 14 марта 2017
for /f "usebackq" %A in (`TYPE c:\temp\file.txt ^| find /v /c "" `) do set numlines=%A

в пакетном файле, используйте %% A вместо% A

2 голосов
/ 03 декабря 2013

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

setlocal enabledelayedexpansion
SET /A maxlines= 10
set "cmd=findstr /R /N "^^" "filename.txt" | find /C ":""
 for /f %%a in ('!cmd!') do set linecount=%%a
GOTO NEXT

:NEXT 
 FOR /F %%A IN ("filename.txt") DO ( 
  IF %linecount% GEQ %maxlines% GOTO ExitLoop
  echo %clientname% %Date% %Time% >> "filename.txt")
 EXIT

:ExitLoop
 echo %clientname% %Date% %Time% > "filename.txt"
 EXIT

Включены переменные среды:% clientname%, имя компьютера удаленного клиента% Date% - текущая дата, а% Time% - текущее время. : NEXT вызывается после получения количества строк в файле. Если число строк файла больше, чем переменная% maxlines%, он переходит к: EXITLOOP, где он перезаписывает файл, создавая новую строку с первой строкой информации. если она меньше переменной% maxlines%, она просто добавляет строку в текущий файл.

1 голос
/ 21 июля 2018

Просто:

c:\>(for /r %f in (*.java) do @type %f ) | find /c /v ""

Шрифт: https://superuser.com/questions/959036/what-is-the-windows-equivalent-of-wc-l

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