Execução de script em lote em pausa durante a pausa

3

Estou desenvolvendo um script em lote complexo e de longa duração e descobri um pequeno problema durante a depuração. Eu tenho uma janela de linha de comando aberta para o caminho da raiz do script, para que eu possa digitar myscript.bat para disparar para teste. Estou usando os comandos PAUSE entre instruções para observar o comportamento do script. No entanto, descobri que digitar CTRL + C durante um comando PAUSE para cancelar a execução é simplesmente interpretado como uma chave para continuar a execução, em vez de violar o script como pretendido.

Eu sei que posso simplesmente matar / fechar a janela de comando, mas é um pouco chato navegar de volta para o caminho correto em uma nova janela de comando toda vez. Existe uma maneira de quebrar a execução de um script em lote com facilidade enquanto estiver em um PAUSE ?

Editar: Parece que PAUSE funciona bem em scripts simples, como indicado por @dbenham. No entanto, se você tiver várias instruções PAUSE aninhadas dentro de uma iteração FOR , não será possível romper no meio da iteração FOR - somente no final. Aqui está um exemplo de script que demonstra o problema:

@echo off

for /l %%y in (2008, 1, 2013) do (
    echo 1
    pause
    echo 2
    pause
    echo 3
    pause
    echo 4
    pause
    echo 5
    pause
)

Se você tentar encerrar qualquer uma das quatro primeiras instruções PAUSE , você descobrirá que seu comando terminate será ignorado e a execução continuará assim mesmo. Mas quando você chegar ao fim, para o quinto PAUSE , você recebe o prompt de término (no exemplo abaixo, eu estava pressionando CTRL + C em cada prompt):

Z:\>test
1
Press any key to continue . . .
2
Press any key to continue . . .
3
Press any key to continue . . .
4
Press any key to continue . . .
5
Press any key to continue . . .
Terminate batch job (Y/N)? y

Alguma idéia de como evitar esse comportamento?

    
por mellamokb 26.08.2013 / 18:53

2 respostas

3

Funciona bem para mim no Win 7 (32 bits)

Aqui está um script de teste trivial

@echo off
echo Before
pause
echo After

Quando executo o acima sem pressionar <Ctrl-C> , recebo o seguinte:

D:\test>test
Before
Press any key to continue . . .
After

D:\test>

Quando pressiono <Ctrl-C> no prompt "Pressione qualquer tecla", recebo:

D:\test>test
Before
Press any key to continue . . .
Terminate batch job (Y/N)? y

D:\test>

EDIT: Solução para a questão de acompanhamento

Não precisa estar em loop. O problema existe com qualquer bloco de código entre parênteses. O bloco inteiro é analisado em uma passagem e executado a partir da memória.

(
  echo Before 1
  pause
  echo Before 2
  pause
  echo After
)

Eu não acho que há uma correção usando o comando PAUSE. Mas eu tenho uma solução simples que deve dar a funcionalidade de depuração que você deseja. Apenas certifique-se de que a variável de ambiente PAUSE ainda não esteja definida antes de executar seu script.

@echo off

:: ------------------------------------------------------
:: Include this block of code at the top of your script
::
setlocal
if not defined pause (
  set "pause=choice /m "........................Continue "&if errorlevel 2 exit"
  cmd /c ^""%~f0" %* ^"
  exit /b
)
:: ------------------------------------------------------


:: Now use %pause% instead of pause anywhere you want within your script
:: Press Y to continue, N to quit
:: The script will immediately terminate if you press N, even if in the
:: middle of a CALL

:: Here is a simple demonstration

call :sub1
exit /b

:sub1
call :sub2
exit /b

:sub2
for /l %%N in (1 1 3) do (
  echo ----- %%N ------
  echo Before 1
  %pause%
  echo Before 2
  %pause%
  echo After
)
exit /b
    
por 26.08.2013 / 20:25
1

Uma maneira de superar o problema de PAUSE em blocos entre parênteses é chamar uma sub-rotina:

@echo off
goto run

:pause
echo %*
pause >nul
exit /b

:run
(
  echo Before 1
  call :pause Please consider aborting with Ctrl+C
  echo Before 2
  call :pause Really consider aborting with Ctrl+C
  echo After
)

Isso resolve o problema pelo menos no Windows 10 e permite mensagens personalizadas para PAUSE .

    
por 04.11.2016 / 16:35