Анализ нескольких текстовых файлов с альтернативными именами файлов, поиск суммы, а затем компиляция вывода с помощью пакетного файла - PullRequest
0 голосов
/ 01 апреля 2019

Отредактировано с рекомендациями пользователя:

У меня есть скрипт, который я запускаю на тысячах серверов, который компилирует ключевые слова из журналов и выводит, сколько раз они встречаются в текстовом файле.Вывод выглядит так для каждого отдельного сервера:

---------- C:\TEMP\TEXT.001: 0
---------- C:\TEMP\TEXT.002: 0
---------- C:\TEMP\TEXT.003: 2
---------- C:\TEMP\TEXT.004: 0
---------- C:\TEMP\TEXT.005: 1

Последнее число после двоеточия - это количество раз, когда ключевое слово присутствует в файле журнала.Таким образом, у меня есть файл результатов с тысяч серверов, где я затем использую xcopy для перемещения в свою папку в той же папке.

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


    @Echo off 
    set "Total=0" 
    for /f "tokens=3 delims=:" %%a in (Server1_Count.txt) do Set /a "Total+=%%a" 
    (echo  %%a >> Server1_CountCompleted.txt Total is %Total%)

У меня есть две проблемы, с которыми я борюсь:

  1. Мне нужно создать цикл, в котором он будет попадать в каждый файл в той же папке, заканчивающийся * __ Count.txt, а затем создавать новый вывод * _CountCompleted.txt. Все файлы начинаются с разных имен хостов, и я пытался использоватьподстановочный знак безрезультатен. (то есть: предполагается, что server1_Count.txt, server2_count.txt будет генерировать server1_CountCompleted.txt, server2_CountCompleted)
  2. Мой текущий вывод для этого сценария может быть направлен только в один файл, и он генерируетновый файл, который выглядит следующим образом:

% a Итого 34

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

server1 Всего 34

1 Ответ

0 голосов
/ 01 апреля 2019

При использовании только set /a нет необходимости в вызове или задержке расширения.

Подсказка: при работе с папками / файлами, которые могут содержать пробелы в имени, лучше использовать двоеточие в качестве разделителей.

:: Q:\Test\2019\04\01\SO_55461444.cmd
@Echo off
set "Total=0"
for /f "tokens=3 delims=:" %%a in (FILE.txt) do Set /a "Total+=%%a"
echo Total is %Total%
pause

Пример вывода (немецкий язык):

> SO_55461444.cmd
Total is 3
Drücken Sie eine beliebige Taste . . .

Новый вариант итерации файлов *_count.txt в данной папке:

:: Q:\Test\2019\04\01\SO_55461444.cmd
@Echo off & SetLocal
:: clear/initialize env vars
set "Total=0"
for /F "delims==" %%A in ('set FileTotal[ 2^>nul') Do Set "%%A="

Pushd "X:\path\Folder" || (Echo couldn't change to folder &Pause&exit /b 1)

Echo Processing folder %CD%
Echo:
:: iterate files in folder
For %%F in (*_count.txt) Do (
    for /f "tokens=3 delims=:" %%A in (
        'Findstr "^-------" "%%F"'
    ) Do Set /A "FileTotal[%%~nF]+=%%A,Total+=%%A"
)

Set FileTotal[
Echo ===================
echo GrandTotal is %Total%
popd
pause

пример вывода:

> Q:\Test\2019\04\01\SO_55461444.cmd
Processing folder Q:\Test\2019\04\02

FileTotal[server1_count]=3
FileTotal[server2_count]=15
===================
GrandTotal is 18
Drücken Sie eine beliebige Taste . . .
...