Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] вывести количество строк в тхт файлах (http://forum.oszone.net/showthread.php?t=305602)

Alexander_88 18-09-2015 13:24 2554756

вывести количество строк в тхт файлах
 
Здравствуйте, подскажите пожалуйста как можно посчитать количество строк в тхт файлах?

Есть папка CONTENT, в ней еще куча папок, в которых есть тхт файлы. Я задаю имена файлов, которые мне нужны. (*.txt - все тхт файлы, start.txt - все файлы, которые найдутся с этим названием). Поиск ведется по всем папках, которые входят в папку CONTENT. Далее скрипт выводит список всех файлов, которые он нашел, в виде пути к файлу (каждый путь с новой строки). После каждого пути рядом справа скрипт через дефис выводит количество строк для данного файла. А ниже (после списка всех файлов) скрипт должен вывести сумму всех строк списка.

Пример:
Я задал файл start.txt

Скрипт вывел:

Код:

C:\OneDrive\work\CONTENT\test\start.txt - 12
C:\OneDrive\work\CONTENT\111\start.txt - 18
C:\OneDrive\work\CONTENT\kron\start.txt - 2
C:\OneDrive\work\CONTENT\trava\start.txt - 458
490


Kazun 18-09-2015 13:40 2554763

PowerShell v4+:
Код:

Get-ChildItem $Path -Include *.txt -File -Recurse | Foreach {$sum=0} {$sum += ($i = [IO.File]::ReadAllLines($_.FullName).Count);"{0} - {1}" -f $_.FullName,$i} {$sum}

Alexander_88 18-09-2015 14:31 2554785

Спасибо, все работает :)

Alexander_88 28-10-2021 07:50 2969924

Здравствуйте. Подскажите, а можно ли здесь сделать исключения, то есть чтобы какие-то файлы не обрабатывались?

Код:

Get-ChildItem "C:\work\CONTENT" $Path -Include fileslink.txt -File -Recurse | Foreach {$sum=0} {$sum += ($i = [IO.File]::ReadAllLines($_.FullName).Count);"{0} - {1}" -f $_.FullName,$i} {$sum}
вот такой код использую.. можно ли сделать исключение для нескольких файлов в папке CONTENT ?

YuS_2 28-10-2021 10:11 2969932

Цитата:

Цитата Alexander_88
можно ли здесь сделать исключения, то есть чтобы какие-то файлы не обрабатывались? »

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

...| Foreach {$sum=0} {
    if ($_.name -notmatch <regexp>){
        $sum += ($i = [IO.File]::ReadAllLines($_.FullName).Count)
        "{0} - {1}" -f $_.FullName,$i
    }
} {$sum}

где <regexp> - регулярное выражение, определяющее наименование файлов, которые необходимо исключить

Либо в командлете Get-ChildItem, использовать параметр -exclude и в нем уже указать исключаемые файлы (могут использоваться маски).
Справка по командлету:
Код:

man Get-ChildItem

===
Цитата:

Цитата Alexander_88
вот такой код использую.. »

Не совсем понятна ваша конструкция:
Код:

Get-ChildItem "C:\work\CONTENT" $Path ...
- Здесь надо указывать либо путь к каталогу, либо путь, который должен быть записан в переменной $Path, то бишь использовать надо что-то одно...

megaloman 28-10-2021 12:57 2969951

CMD
Код:

@Echo Off
cls
rem                  Сумма    Папка                      Маска  Список исключений если есть
        Call :Count "NTotal" "C:\OneDrive\work\CONTENT" "*.bat" ""\Dir21\" "\Dir11\1.bat" "2001""
 
        Echo NTotal=%NTotal%
pause
Exit /B

:Count
        >~Exclude.tmp (For %%m In (%~4) Do Echo %%~m)

        For /F "usebackq delims=" %%f In (`Xcopy /L /S /EXCLUDE:~Exclude.tmp "%~2\%~3" "%Tmp%\" ^| findstr.exe /C:":"`) Do (
                Set /A NF=0
                For /F "usebackq tokens=1* delims=:" %%i In (`FindStr /R /N /C:".*" "%%f"`) Do Set /A NF=%%i
                Call Echo %%NF%% = %%f
                Call Set /A %~1+=%%NF%%
        )
        Del ~Exclude.tmp       
Exit /B


DJ Mogarych 28-10-2021 15:29 2969970

Powershell:
Код:

$report = dir "C:\OneDrive\work\CONTENT\*.txt" -exclude "*name*" -Recurse |% {
"$($_.fullname);$((gc $_).count)" |ConvertFrom-Csv -Delimiter ';' -Header Путь,Строк
}
$report
($report.Строк |measure -sum).sum


Alexander_88 29-10-2021 01:37 2970044

спасибо всем за ответы.
megaloman, подскажите, в подкаталоги скрипт обрабатывает?
Делаю к примеру
Код:

Call :Count "NTotal" "C:\OneDrive\work\CONTENT" "fileslink.txt"
пишет что fileslink.txt не найден.. а если так:
Код:

Call :Count "NTotal" "C:\OneDrive\work\CONTENT\folder1" "fileslink.txt"
тогда нормально.. (файл fileslink.txt находится в папке folder1)

megaloman 29-10-2021 14:51 2970083

Цитата:

Цитата Alexander_88
подкаталоги скрипт обрабатывает? »

Обрабатывает. Но тут сработал баг Xcopy.
У Вас есть, например, "C:\OneDrive\work\CONTENT" и там нет файла "fileslink.txt".
XCopy при этом не хочет искать этот файл в подпапках.
Если бы файл там был - прекрасно ищет.
Ситуация еще интереснее: если в маске файла есть подстановочный знак, например: "fileslink*.txt", то всё прекрасно ищется.
Учел этот баг, вот рабочая версия
Код:

@Echo Off
cls
rem                  Сумма    Папка                      Маска  Список исключений если есть
        Call :Count "NTotal1" "C:\OneDrive\work\CONTENT" "*.vbs" ""\Dir21\" "\Dir11\""
        Echo +++ NTotal(*.vbs)=%NTotal1% &Echo.

        Call :Count "NTotal2" "C:\OneDrive\work\CONTENT" "Я21090916.bat" ""\Dir21\" "\Dir11\1.bat" "2001""
        Echo +++ NTotal(Я21090916.bat)=%NTotal2% &Echo.

        Set /A NTotal=%NTotal1%+%NTotal2%
        Echo === NTotal=%NTotal%
pause
Exit /B

:Count
        Set /A %~1=0
        >~Exclude.tmp (For %%m In (%~4) Do Echo %%~m)

        Set Comm="Xcopy /L /E /EXCLUDE:~Exclude.tmp "%~2\%~3?" "%Tmp%\" | findstr.exe /I /R /C:"^%~3$""
        Echo %3 |>nul 2>&1 FindStr /C:"*" /C:"?" &&Set Comm="Xcopy /L /E /EXCLUDE:~Exclude.tmp "%~2\%~3" "%Tmp%\" | findstr.exe /I /C:":""

        For /F "usebackq delims=" %%f In (`%Comm%`) Do (
                Set /A NF=0
                For /F "usebackq tokens=1* delims=:" %%i In (`FindStr /R /N /C:".*" "%%f"`) Do Set /A NF=%%i
                Call Echo %%NF%% = %%f
                Call Set /A %~1+=%%NF%%
        )
        Del ~Exclude.tmp       
Exit /B

Здесь для примера я в одном батнике обработал две маски с выводом статистики по каждой. Работает как с маской файла, так и с точным именем.

Alexander_88 29-10-2021 17:31 2970102

megaloman, спасибо, теперь все ищет... а если в списке исключений есть файл в таким же именем в определенной папке, его можно исключить? (либо всю папку).

Пробовал так:
Код:

Call :Count "NTotal1" "C:\OneDrive\work\CONTENT" "fileslink.txt" "01 stop start"
и так:
Код:

Call :Count "NTotal1" "C:\OneDrive\work\CONTENT" "fileslink.txt" "C:\work\CONTENT\01 stop start\fileslink.txt"
в обоих случаях скрипт исключает все папки, которые начинаются с 01.. т.е. не только "01 stop start", а еще и "01 folder1" "01 folder2" и т.д.

megaloman 29-10-2021 20:17 2970121

Alexander_88, Была проблема с исключениями папок с пробелами в именах. Исправил, пробуйте.
Код:

@Echo Off
cls
rem                  Сумма    Папка                      Маска          Список исключений если есть
        Call :Count "NTotal" "C:\OneDrive\work\CONTENT" "fileslink.txt"
        Echo === NTotal=%NTotal%

        Call :Count "NTotal" "C:\OneDrive\work\CONTENT" "fileslink.txt" "\01 stop start\" "\01 folder1\fileslink.txt" 
        Echo === NTotal=%NTotal%
pause
Exit /B

:Count
        2>nul Del ~Exclude.tmp
        :Begin
                >>~Exclude.tmp Echo %~4
                Shift /4
                If Not "%~4"=="" GoTo :Begin


        Set Comm="Xcopy /L /E /EXCLUDE:~Exclude.tmp "%~2\%~3?" "%Tmp%\" | findstr.exe /I /R /C:"^%~3$""
        Echo %3 |>nul 2>&1 FindStr /C:"*" /C:"?" &&Set Comm="Xcopy /L /E /EXCLUDE:~Exclude.tmp "%~2\%~3" "%Tmp%\" | findstr.exe /I /C:":""

        Set /A %~1=0
        For /F "usebackq delims=" %%f In (`%Comm%`) Do (
                Set /A NF=0
                For /F "usebackq tokens=1* delims=:" %%i In (`FindStr /R /N /C:".*" "%%f"`) Do Set /A NF=%%i
                Call Echo %%NF%% = %%f
                Call Set /A %~1+=%%NF%%
        )
        Del ~Exclude.tmp       
Exit /B

Чтобы исключить целиком папку, укажите например "\01 stop start\"
Чтобы исключить конкретный файл, то так: "\01 folder1\fileslink.txt"
Папок, файлов может быть несколько. В кавычках через пробелы.

Alexander_88 30-10-2021 19:44 2970187

megaloman, Спасибо, работает теперь исключение :)


Время: 10:18.

Время: 10:18.
© OSzone.net 2001-