findstr не может принять строку из нескольких циклов FOR

Коды, как показано ниже:

я получаю ошибку ниже: FINDSTR: нет строк поиска

Я проследил ошибку, и она исходит отсюда:

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

Скрипт работает правильно, если я заменяю переменную 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!
    )

person Peps    schedule 23.02.2017    source источник
comment
Я не вижу SETLOCAL ENABLEDELAYEDEXPANSION   -  person Squashman    schedule 23.02.2017
comment
обрезал сценарий. У меня он в верхней части. @echo off setlocal EnableDelayedExpansion setlocal enableextensions   -  person Peps    schedule 23.02.2017
comment
Да, ошибка в строке, которую вы сказали. Должно быть: ^| findstr /B "!numbers!"   -  person Aacini    schedule 23.02.2017
comment
что-то не так с трубой ^| попробовал поставить usebackq и поэкспериментировать с кавычками, двойными кавычками и акцентным символом. ничего не работает.   -  person Peps    schedule 23.02.2017
comment
Вам не нужно использовать опцию USEBACKQ. Почему вы удаляете один символ из конца переменной имени файла? set FILENAME=!FILENAME:~0,-1!   -  person Squashman    schedule 23.02.2017
comment
Я отслеживаю значение переменной, поэтому я получил команду echo в следующей строке. При проверке файла строка получила пробел в конце. Эти команды предназначены только для моего исследования.   -  person Peps    schedule 23.02.2017
comment
Я не вижу в вашем коде ничего, что могло бы ввести пробел в конце имени вашего файла. Вы должны просто иметь возможность использовать свою переменную FOR везде, где вы используете переменную имени файла.   -  person Squashman    schedule 23.02.2017
comment
Я разместил рабочую версию без внешнего цикла FOR. Может быть, кто-то может помочь поставить внешний цикл FOR, который будет работать?   -  person Peps    schedule 23.02.2017
comment
Вы до сих пор не использовали переменную числа с отложенным расширением. Это вообще не должно работать.   -  person Squashman    schedule 23.02.2017
comment
@Squashman: Да, без внешнего цикла второй for помещается после первого, поэтому ^| findstr /B "%numbers%" в этом случае работает правильно. @ Peps: Больше часа назад я сказал вам, что вы должны заменить предыдущий FINDSTR на этот: ^| findstr /B "!numbers!", то есть заменить стандартное расширение %numbers% на !numbers! с задержкой. Вы тестировали это? :/   -  person Aacini    schedule 23.02.2017
comment
В этой строке: set FILENAME=%%~nxi есть пробел после i. Чтобы избежать ошибок такого типа, вы должны заключить в кавычки всю часть var=value следующим образом: set "FILENAME=%%~nxi". Если вы сделаете это, вы должны удалить строку set FILENAME=!FILENAME:~0,-1!...   -  person Aacini    schedule 23.02.2017
comment
Привет, ребята. теперь я пытаюсь пересмотреть его, чтобы сделать его чище, и, как вы посоветовали, лучше завершить это одним куском. Я очистил и удалил set FILENAME=!FILENAME:~0,-1!, а с set "FILENAME=%%~nxi" больше не было места в конце переменной. Теперь это моя команда, но она все равно не работает for /F "tokens=1* delims=:" %%a in ('findstr /N "^" "!FILENAME!" ^| findstr /B "!numbers!"') do (   -  person Peps    schedule 24.02.2017
comment
выходит такая же ошибка.   -  person Peps    schedule 24.02.2017


Ответы (1)


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

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

@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
person Peps    schedule 23.02.2017
comment
Приятно видеть, что вы нашли решение своей проблемы. Но видели ли вы комментарии Аачини а ты пробовал? Я также уверен, что %numbers% вместо !numbers! и пробел в конце присваивания переменной FILENAME были единственными проблемами. Пожалуйста, поправьте меня, если я ошибаюсь. - person J.Baoby; 23.02.2017
comment
Кроме того, вы должны быть осторожны с использованием SetLocal. Каждый SetLocal устанавливает новую среду. Поэтому у каждого SetLocal обычно должен быть EndLocal, который закрывает среду, когда она больше не нужна, но в каждом из ваших сценариев у вас есть два setlocal в начале и только один endlocal. На самом деле вам не нужно 2 setlocal для включения расширений и отложенного расширения. Вы можете сделать это с одним: setlocal EnableDelayedExpansion EnableExtensions. Это также решит проблему незакрытых сред. - person J.Baoby; 23.02.2017
comment
Независимо от ваших ошибок кодирования и ничего не делая, мы предложили, чтобы вы могли сохранить весь код в одном пакетном файле, вызвав вместо этого метку. - person Squashman; 23.02.2017