2014-12-15 3 views
0

У меня есть следующий код: сочетание пакетной и linux-dos (команда gawk). У меня нет источника (sortgrad с параметрами -d -v -g -r), поэтому никакого контроля над ним нет. Код работает хорошо, за исключением случаев, когда sortgrad зависает, тогда я должен использовать control + C и он продолжает работать в следующем каталоге, но он не обновляет параметры ввода (переменные) в sortgrad. Тогда у меня есть две проблемы: как продолжить цикл for без управления + C, когда это необходимо, и проблема перепадающих переменных. Благодаряпеременные не обновляются после управления + C в пакетном файле


for /f "eol= " %%i in (tests) do ( 

cd %%i 
echo.2 > input 
echo.y >> input 
echo.1 >> input 
echo.%%i.out >> input 

gawk "{print $1}" data > v 
gawk "{print $2}" data > g 

set /p grad= < g 
set /p vel= < v 

echo %grad% | gawk "{print $1-0.03}" > g1 
echo %grad% | gawk "{print $1+0.03}" > g2 
set /p gmin= < g1 
set /p gmax= < g2 

cmd.exe /C "sortgrad -d vanloc.dvr -v %vel% 7.0 -g %gmin% %gmax% -r 1.70 1.80" < "input" > result 

cd..) 

+0

просто идея: что произойдет, если вы разместите утверждения своего цикла Loop в подпрограмме и вызовите его? т.е. для/f "eol =" %% i in (tests) do 'call: sub' – loco

ответ

0

Переменные создаются, но не доступ к ним должным образом.

Нормальное расширение %grad% происходит во время разбора, и весь блок в скобках в вашем цикле FOR разобран за один проход. Таким образом, %grad% остается постоянным значением - значением, которое существовало до начала цикла.

Это то, за что рассчитано расширение с задержкой. Поместите setlocal enableDelayedExpansion вверху, а затем получите доступ к своим переменным как !grad!

+0

пакет, работающий с инструкциями. Благодарю. Control + C по-прежнему необходим, если программа зависает. Есть ли способ контролировать прошедшее время (не работать) для завершения процесса (exe) и продолжить следующий цикл? – rr19690604

Смежные вопросы