2016-10-06 5 views
1

Я вроде как новый для пакетных команд и пытался автоматизировать что-то, что мы делаем вручную. У меня есть файл журнала, который загружается каждый день, затем я ищу определенные элементы в нем, используя Findstr (вывод в другой файл), а затем разделяю то, что было найдено в более мелкие файлы.Команды командного файла - Findstr, разделение и переменные имени файла

У меня возникли проблемы с созданием имен файлов и переменных имени файла и их использованием во всем моем коде. Мне был передан код сплиттера, поэтому я просто пытаюсь включить Findstr в него. Любые советы или посмотреть, что я делаю неправильно?

Пример:

Campaign ID: 1234 
Campaign Name: Pepsi 
Impression Filename: 10-06-16_file.log 
Day of week: 2 

Это будет выглядеть через 10-06-16_file.log для любых строк с ID кампании 1234 и вывода их на fnd_10-06-16_file.log.

Если fnd_10-06-16_file.log размер файла больше, чем 177000kb затем разбить файл на более мелкие файлы с именем 2SplitFile1_Pepsi.log, 2SplitFile2_Pepsi.log, 2SplitFile3_Pepsi.log и т.д.

setlocal ENABLEDELAYEDEXPANSION 
@echo off 

REM Ask for Campaign information to find 
SET /P campaignid="Campaign ID(s): " 
SET /P campaignname="Campaign Name: " 
SET /P impressionfile="Impression Filename: " 
SET /P dayofweek="Day of week: " 

SET fnd_impressionfile=%campaignname%_%impressionfile% 
SET maxbytesize=177000 
SET fnd_impressionfile_sz=%%~zfnd_impressionfile 


REM Find campaigns inside log file 
findstr "%campaignname%" %impressionfile% > %fnd_impressionfile% 


REM Split log file if greater than 177000 kb 
if fnd_impressionfile_sz > maxbytesize (

    REM Edit this value to change the name of the file that needs splitting. Include the extension. 
    SET BFN=%fnd_impressionfile% 
    REM Edit this value to change the number of lines per file. 
    SET LPF=1000000 
    REM Edit this value to change the name of each short file. It will be followed by a number indicating where it is in the list. 
    SET SFN=SplitFile 

    REM Do not change beyond this line. 

    SET SFX=%BFN:~-3% 

    SET /A LineNum=0 
    SET /A FileNum=1 

    For /F "delims=" %%l in (%BFN%) Do (
     SET /A LineNum+=1 

     echo %%l >> %dayofweek%%SFN%!FileNum!_%campaignname%.%SFX% 

     if !LineNum! EQU !LPF! (
      SET /A LineNum=0 
      SET /A FileNum+=1 
      ) 

     ) 
) 

endlocal 
pause 
+2

Вы пытаетесь получить размер файла показа с помощью этого кода: 'SET fnd_impressionfile_sz = %% ~ zfnd_impressionfile'. Если да, то это не так, как это работает. Для этого вам нужно использовать команду FOR. – Squashman

ответ

0

Во-первых, изменить SET fnd_impressionfile_sz=%%~zfnd_impressionfile к FOR %%a in (%fnd_impressionfile%) DO SET fnd_impressionfile_sz=%%~za

Затем дважды проверить вас maxbytesize. В вашем описании указано kb, но в пакете подразумевается байт. fnd_impressionfile_sz содержит значение байта.

Другое, что я вижу, это то, что вы используете оператор перенаправления> в if fnd_impressionfile_sz > maxbytesize. Вы должны изменить его на GTR или GEQ. См. HELP IF.