Pular as pausas ao executar um script em lotes no Agendador de Tarefas

2

Eu tenho um script em lotes que é executado em um agendamento e que às vezes é executado manualmente. Este script tem um pause para que uma mensagem echo ed permaneça visível quando o script é executado manualmente - isto é, sem a pausa, a janela do console fecha automaticamente e o usuário não tem idéia do motivo.

Encontrei soluções para quando um script em lote chama outro e envolve passando em um parâmetro opcional que, se presente, o script pulará sua pausa. Ambos os casos exigem a alteração do script em lote.

Existe uma maneira simples de executar o script em lote com pausas desativadas ou ignoradas, sem alterar o script em si? Talvez algo como myBatch.bat --skippauses ?

    
por mouseas 21.10.2015 / 23:07

1 resposta

1

MANIPULAÇÕES RÁPIDAS DE CASOS PARA SALVAR A LÓGICA DE ARQUIVOS DE LOTES DE EXECUÇÃO

PARA INICIAR: Eu não estou familiarizado com as formas de ignorar PAUSE comandos em um script em lote (pelo menos no seu caso para atender às suas requisitos), a menos que você use uma das duas soluções que listarei abaixo detalhadamente. Não conheço nenhum comutador como --skippauses que realize isso com uma solução tão simples ao chamar ou executar um script em lote que funcione apenas para pular qualquer um ou todos os comandos PAUSE sem alterar a lógica real do script em lote anteriormente para potencialmente aceitar isso como um argumento para NÃO fazer um comando PAUSE , mas você teria que fazer alterações na lógica do script em lote para que funcione dessa forma.

SOLUÇÃO 1 (não altera o arquivo de script em lote que você chama)

Crie dinamicamente um novo script criado dinamicamente CORRESPONDENTE à lógica do script CALLed e EXCLUDE todas as linhas que contenham a cadeia PAUSE (insensível a maiúsculas e minúsculas) e execute o script criado dinamicamente com a mesma lógica do script CALLed menos todos LINES contendo PAUSE e, portanto, qualquer comando PAUSE .

Basta adicionar algo semelhante ao seu myBatch.bat como meu exemplo abaixo e não se esqueça de apontar diretórios, etc., onde esses precisam ser. Essencialmente, isso executará o comando FINDSTR /i /v com relação ao script você CALL e, em seguida, lerá linha por linha, mas EXCLUDE todas as linhas que contiverem a sequência PAUSE que NÃO seja sensível a maiúsculas e canalize isso para um novo script em lote dinamicamente construído com um nome exclusivo em que você executa o CALL .

EXEMPLO DE SCRIPT

@ECHO OFF

:: Parse out space from hour part of time and replace with a zero (for hours of 00:00 - 09:59)
SET hh=%TIME:~0,2%
SET hh=%hh: =0%
SET DateString=%DATE:~10,4%%DATE:~4,2%%DATE:~7,2%_%hh%%TIME:~3,2%%TIME:~6,2%
SET DynScriptName=%Temp%\NOPAUSE_%~N0_%DateString%.cmd

:: If DynScriptName already exists, just delete it
IF EXIST "%DynScriptName%" DEL /F /Q "%DynScriptName%"

:: Use FINDSTR to ignore all lines containing "pause" but pipe all other lines to DynScriptName to later CALL/EXECUTE
:: /i switch denotes case insensitivity, /v switch denotes exclude value in results piped to DynScriptName
FINDSTR /i /v "pause" "C:\folder\folder\myBatch.bat">"%DynScriptName%"

:: Call the dynamically built script without PAUSE command lines
CALL "%DynScriptName%"

:: If DynScriptName already exists, just delete it (post cleanup)
IF EXIST "%DynScriptName%" DEL /F /Q "%DynScriptName%"  
GOTO EOF

CONCLUSÃO: Isso ( Solution 1 ) deve satisfazer suas duas necessidades em particular:

  1. Você tem uma maneira de executar um script criado dinamicamente sem PAUSE comandos baseados na execução de um script que cria dinamicamente um novo script com base na lógica desses scripts [contents], por execução, mas para excluir todos os PAUSE contendo linhas e, assim, eliminando os comandos PAUSE da execução.

  2. Além disso, certifique-se de que o script atual que você está executando via CALL NÃO precise ser modificado para acomodar as alterações solicitadas em sua consulta, pois ela apenas reconstrói dinamicamente outra excluída o que você pediu.

  3. Além disso, outra solução simples como em Solution 2 (abaixo) fornece um método para realmente fazer alterações no script chamado CALL, se você também quiser considerar essa rota fácil, tenho meu exemplo Solution 2 , assim como os outros artigos para mudanças necessárias nesse nível.

SOLUÇÃO 2 (muda a lógica do script de lote)

No seu script com o comando PAUSE , você colocaria um rótulo como abaixo, por exemplo. Em seguida, você colocaria um rótulo na lógica logo após o comando PAUSE para poder adicionar IF logic para procurar o primeiro argumento passado ao script quando ele for executado.

Logo acima do rótulo do comando PAUSE (significando :PauseLabel no meu exemplo) , você colocaria o IF [%1]==[] GOTO PauseLabel e a próxima linha abaixo que você colocaria GOTO SkipPause .

Isto diz se o script foi executado e NÃO o primeiro argumento que passou, então vá para :PauseLabel e faça o que está lá, que é PAUSE. Se houver QUALQUER primeiro argumento passado, então ele irá para :SkipPause e faça o seguinte, que é o resto da sua lógica sem o comando PAUSE .

Dessa forma, as pessoas podem executá-lo manualmente o dia todo clicando duas vezes nele (sem passar um argumento), mas o trabalho agendado pode passar qualquer primeiro argumento desejado (é apenas um argumento falso) para garantir que IF lógica pode apenas confirmar se existe ou se é NULL.

Script com PAUSE comando Primeiro argumento de verificação e ignorar o exemplo da lógica abaixo

<Script logic before PAUSE>

IF [%1]==[] GOTO PauseLabel
GOTO SkipPause

:PauseLabel 
 PAUSE

:SkipPause
 <Rest of your batch logic>

Passando o exemplo do argumento para o seu script (onde está agendado)

myBatch.bat SkipPause

Por favor, note que quando você agendar o lote, o primeiro argumento pode ser SkipPause , dummy , DosEquis ou qualquer outra coisa que você queira que seja. A lógica com o IF apenas diz: "existe um argumento passado para o script quando ele foi executado e, em caso afirmativo, vá para :SkipPause , se não, vá para :PauseLabel .

    
por 22.10.2015 / 00:18

Tags