я запускаю пакетный файл для обработки некоторого кода, в то время как он вызывает другой пакетный файл и должен вернуть переменную, но методы, описанные в справочных страницах о local/endlocal, похоже, здесь не работают, что я делаю неправильно, пожалуйста?
первый пакетный файл:
@ECHO OFF
setlocal
call secondbatchfile.bat xyz
echo. [%val1%]
второй пакетный файл:
@if (@a==@b) @end /* <== btw what does this code do ???
@echo off
setlocal enabledelayedexpansion
set "URL=%~1"
set bla bla ...
do bla bla ...
for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0" "%URL%"') do (
rem trim whitespace from beginning and end of line
for /f "tokens=*" %%x in ("%%~I") do set "line=%%x"
rem test that trimmed line matches "variable=number"
echo !line! | findstr /i "^to[a-z]*=[0-9]*" >NUL && (
rem test was successful. Scrape number.
for /f "tokens=2 delims==" %%x in ("%%I") do set "val1=%%x"
echo !val1! <== this works
ENDLOCAL & SET top=%val1% <== this not
)
)
это приводит к:
c:\test>firstbatchfile.bat
123456789 <== this works
[] <== this not
я пробовал другой синтаксис возвращаемой переменной, такой как !val1!
или %%val1
- ничего не работало. что мне не хватает?
ОБНОВЛЕНИЕ: относительно другого примера здесь на сайте я пробовал:
call seconbatchfile.bat xyz ret1
echo. [%2%] [%ret1%]
и во втором файле изменено:
rem ENDLOCAL & SET %2=!val1!
тоже не работает?
РЕШЕНИЕ:
второй пакетный файл может быть исходным скриптом из rojo, считывающим весь веб-сайт, я оставил строки синтаксиса обрезки и сопоставления, чтобы возвращать только соответствующие совпадения:
for /f "delims=" %%I in ('cscript /nologo /e:jscript "%~f0" "%URL%"') do (
rem trim whitespace from beginning and end of line
for /f "tokens=*" %%x in ("%%~I") do set "line=%%x"
rem test that trimmed line matches "variable=number"
echo !line! | findstr /i "^[a-z]*=[0-9]*" >NUL && (
echo(%%I
)
)
и первый пакетный файл, вызывающий его, выполнит поиск двух необходимых параметров, например:
@ECHO OFF
setlocal
for /f "delims=" %%I in ('secondbatchfile.bat "http://xyz"') do (
echo %%I | findstr /i "top" >NUL && (
for /f "tokens=2 delims==" %%x in ("%%I") do (
set "updir=%%x"
)
)
echo %%I | findstr /i "low" >NUL && (
for /f "tokens=2 delims==" %%x in ("%%I") do (
set "lowdir=%%x"
)
)
)
echo.[%updir%]
echo.[%lowdir%]
большое спасибо rojo за фантастический код
set RETURNVALUE=your_value
- person shibormot   schedule 22.03.2013@if
абсолютно ничего не делает, поскольку строка(@a
никогда не может быть равна строке@b)
. Ведущий@
подавляет эхо-оператор на консоль для этого ОДНОГО оператора. Вероятно, его можно безопасно удалить, если только не используется какой-то действительно неясный метод, например, какая-то другая [пакетная?] Программа, пытающаяся найти эту строку в исходном файле .bat. - person Magoo   schedule 22.03.2013do set val1=%%x
- если я удалю фрагмент кода endlocal, результат также будет пустым при вызове пакета? - person peet   schedule 22.03.2013