2017-02-23 84 views
0

кодов, как показано ниже:Findstr не может не принимать строку из нескольких циклов

им получать ниже ошибок: Findstr: Нет строку поиска

Я прослеживал ошибку ИОСА идет отсюда:

for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "!FILENAME!" ^| findstr /B "%numbers%"') do (... 

Сценарий работает правильно, если Im заменяет переменную FILENAME точным именем файла вручную. Но мне нужно, чтобы положить его в цикле, чтобы выполнить в нескольких файлах ..

for /r %%i in (LOG_FILE*.txt) do ( 
    set FILENAME=%%~nxi 

    for /F "delims=:" %%a in ('findstr /I /N /C:"fin.700 " !FILENAME!') do (
     set /A val1=%%a-3, val2=%%a+3, val3=%%a+4, val4=%%a+11, val5=%%a+13 , val6=%%a+29, val7=%%a+30 
     set "numbers=!numbers!!val1!: !val2!: !val3!: !val4!: !val5!: !val6!: !val7!: " 

    ) 

    set FILENAME=!FILENAME:~0,-1! 
    echo !FILENAME!>>tmptmptmp.tmp 

    for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "!FILENAME!" ^| findstr /B "%numbers%"') do (
     set linestr=%%b 
     echo !linestr! 
    ) 
) 

Работа без внешнего цикла FOR

@echo off 
setlocal EnableDelayedExpansion 
setlocal enableextensions 
rem Assemble the list of line numbers 
set numbers= 
if exist "tmp" del "tmp" 
if exist "tmp2" del "tmp2" 
if exist "tmp.txt" del "tmp.txt" 

REM for /r %%i in (LOG_FILE*.txt) do ( 
     REM set FILENAME=%%~nxi 
     set FILENAME=LOG_FILE14012015.txt 

    for /F "delims=:" %%a in ('findstr /I /N /C:"fin.700 " !FILENAME!') do (
     set /A val1=%%a-3, val2=%%a+3, val3=%%a+4, val4=%%a+11, val5=%%a+13 , val6=%%a+29, val7=%%a+30 
     set "numbers=!numbers!!val1!: !val2!: !val3!: !val4!: !val5!: !val6!: !val7!: " 
    ) 
    for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%FILENAME%" ^| findstr /B "%numbers%"') do (
    set linestr=%%b 
    echo !linestr! 
    ) 
+0

Я не вижу SETLOCAL ENABLEDELAYEDEXPANSION – Squashman

+0

урезана сценарий. У меня это на верхней части. @echo off setlocal EnableDelayedExpansion setlocal enableextensions – Peps

+3

Да, ошибка указана в строке, которую вы указали. Это должно быть: '^ | findstr/B "! numbers!" ' – Aacini

ответ

0

Спасибо за помощь, ребята. Я сделал обходной путь, так как им не удалось заставить findstr правильно работать с моими требованиями. Для обработки логики два отдельных командных сценария. Ниже приведен экземпляр на случай, если кто-то заинтересован.

битой файл, который будет обрабатывать внешний цикл:

@echo off 
setlocal EnableDelayedExpansion 
setlocal enableextensions 

::Script that will loop for multiple files and will call search.bat 

if exist "tmp.txt" del "tmp.txt" 
if exist "multiple_search.log" del "multiple_search.log" 
@echo Starting search... >> multiple_search.log 

for /r %%i in (LOG_FILE*.txt) do (

    @echo Searching %%i >> multiple_search.log 
    call search.bat %%i 
          ) 

@echo Search completed... >> multiple_search.log 

endlocal 

Главная летучая мышь файл:

@echo off 
setlocal EnableDelayedExpansion 
setlocal enableextensions 

set numbers= 
if exist "tmp" del "tmp" 
if exist "tmp2" del "tmp2" 

    set FILENAME=%1 

    for /F "delims=:" %%a in ('findstr /I /N /C:"fin.700 " !FILENAME!') do (
     set /A val1=%%a-3, val2=%%a+3, val3=%%a+4, val4=%%a+11, val5=%%a+13 , val6=%%a+29, val7=%%a+30 
     set "numbers=!numbers!!val1!: !val2!: !val3!: !val4!: !val5!: !val6!: !val7!: " 
    ) 

    for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "%FILENAME%" ^| findstr /B "%numbers%"') do (
    set linestr=%%b 
    echo !linestr! 
    echo !linestr!>>tmp 
    ) 

    set delim== 
    for /f "tokens=1*" %%a in (tmp) do (

    echo %%a|find "!delim!" >nul 
    if !errorlevel!==0 (echo %%a%%b >> tmp2) else (echo record=%%a%%b >> tmp2) 

    ) 

    set counter=0 
    set var= 
    for /f "tokens=1* delims==" %%a in (tmp2) do (
     set /a counter=!counter!+1 
     set var=!var!%%b 

     set var=!var: =! 
     set var=!var!, 

     if !counter! geq 7 (
     echo !var! >> tmp.txt 
     set counter=0 
     set var=) 
    ) 

endlocal 
+2

Замечательно видеть, что вы придумали решение своей проблемы. Но вы видели [комментарии Ачини] (https: // stackoverflow.com/questions/42405512/findstr-not-able-to-accept-string-from-multiple-for-loop # comment71961324_42405512), и вы попробовали? Я также уверен, что '% numbers%' вместо '! Numbers! 'И пространство в конце назначения переменной FILENAME были единственными проблемами. Пожалуйста, поправьте меня, если я ошибаюсь. –

+1

Кроме того, вы должны быть уверены в использовании 'SetLocal'. Каждый «SetLocal» устанавливает новую среду. Поэтому каждый 'SetLocal' обычно должен иметь« EndLocal », который закрывает среду, когда она больше не нужна, но в каждом из ваших сценариев у вас есть два' setlocal 'в начале и только один' endlocal'. На самом деле вам не нужно 2 'setlocal' для включения расширений и задержки расширения. Вы можете сделать это с помощью одного: 'setlocal EnableDelayedExpansion EnableExtensions'. Это также решит проблему, которая не закрывается. –

+0

Независимо от ваших ошибок кодирования и не предпринимайте никаких действий, мы предположили, что вы могли бы сохранить весь код в одном пакетном файле вместо CALLING. – Squashman