2015-06-28 3 views
3

У меня есть следующий код:Windows, партия: переменная теряется после запуска еще один пакетный файл

@echo off 
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 
set FILENAME=testfilename 
for /L %%n in (1,0,10) do (
    echo name-before: !FILENAME! 
    another-batch-file 
    SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION 
    @echo off 
    echo name-after: !FILENAME! 
) 
@echo on 
ENDLOCAL 

При запуске следующее вторит консоль:

name-before:testfilename 
name-after:!FILENAME! 

Переменная FILENAME в настоящее время установите на «testfilename» и правильно передается на терминал. Тем не менее, после выполнения еще одного-пакетного файла FILENAME не может быть разрешен, и «FILENAME» вместо «testfilename» отражается. Я посмотрел в пакетном файле, который вызывается, но не может видеть какой-либо очевидный код или настройки.

Интересно, есть ли очевидная проблема. Thanks

+0

Проверьте синтаксис 'for/L'; вы намеревались написать бесконечный цикл? –

ответ

3

Здесь можно поработать рядом.

  1. Некоторые общие рекомендации при отладке пакетного файла: Удалите echo off линию в верхней части. Удивительно, что вы можете узнать, когда не подавляете свою отладочную информацию.

  2. Внутри цикла почти всегда используется setlocal. Каждый вызов выделяет ресурсы для полной копии блока среды, который вы не вызываете endlocal для освобождения.

Что касается эха переменных, я не могу воспроизвести описанное вами поведение. Когда я запускаю свой код, я получаю сообщение name-before: !FILENAME!. Это правильно выводит, когда я использую ключевое слово CALL, описанное ниже.

Я подозреваю, что основная проблема связана с тем, как вы вызываете «другой-пакетный файл» без использования ключевого слова CALL. В общем, вы never хотите запустить командный файл непосредственно из другого пакетного файла. Вторая партия полностью заменяет первую, и никакие дальнейшие строки из внешней партии не будут выполняться. Фактически, он функционирует как оператор EXIT.

:: This line executes 
set foo=1 

:: Now run another batch file 
other.cmd 

:: This line never executes, because this batch was canceled when 
:: the other started running 
set foo=2 

Решение использовать CALL ключевое слово, чтобы запустить другой пакетный файл. Затем текущий будет продолжаться, как только это будет сделано.

:: Now run another batch file 
CALL other.cmd 

:: This line runs as normal 
set foo=2 

В своем коде, это трудно сказать, потому что цикл продолжается до текущего оператора (for /L) не закончит работу, но ваш последний ENDLOCAL и что-нибудь еще в файле никогда не будет работать.

+0

'В вашем примере ничего не выполняется после вызова другого-пакетного файла.' - тогда почему он печатает 'echo name-after:! FILENAME!'? – GSerg

+1

@GSerg. Поскольку цикл анализируется и кэшируется в памяти и продолжает работать даже после завершения пакетной обработки. Но он больше не работает в контексте командного файла, и никакие команды после цикла не будут выполнены. – dbenham

+0

@dbenham В вопросе или ответе не было никаких циклов, когда я разместил это. – GSerg

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