Execute um programa em um script em lote e espere que ele termine antes de continuar

5

Eu tenho um requisito muito específico. Eu estou tentando fazer upload de arquivos via sftp que usa chaves privadas. Eu já tenho um arquivo bat que se conecta ao host e carrega o arquivo, no entanto, preciso mover os arquivos enviados uma vez concluídos para outro caminho.

O primeiro arquivo bat é chamado start.bat . Isso se conecta ao servidor sftp e carrega o arquivo. Eu estou usando o winscp para se conectar ao host.

O segundo arquivo bat é chamado done.bat . Isso move os arquivos de um diretório para outro.

Estou chamando o segundo arquivo bat do primeiro usando call done.bat . O problema que tenho é que done.bat é concluído antes mesmo que o primeiro arquivo de lote tenha a chance de autenticar, fazer login e fazer upload.

Quero mover apenas o arquivo depois que o upload for concluído. Se o upload falhar por algum motivo, o segundo arquivo não será executado.

Os arquivos bat estão em uma máquina com Windows XP.

    
por PeanutsMonkey 24.08.2012 / 21:18

2 respostas

5

use start /wait winscp ... para iniciar a transferência de arquivos, isso irá pausar o script em lote até que o winscp saia, você pode adicionar os comandos de movimentação depois dessa linha ou call done.bat

 start /wait winscp ...
 call done.bat

Você deve combinar isso com a verificação de erros sugerida por Mark Allen

Pessoalmente, eu usaria um cliente SFTP de linha de comando (como o fornecido com o Putty ou OpenSSH), o que eu acho que evitaria esse tipo de problema.

    
por 24.08.2012 / 21:35
4

Modifique o start.bat para detectar falhas por parte do winscp.exe. Chame somente o done.bat se o winscp.exe sair com um código de saída de 0.

Tente algo assim:

winscp.exe blah blah blah
if not errorlevel 0 goto end
call done.bat
:end

Observe que só presumo que o winscp.exe saia com 1 ou mais de erro. Verifique a documentação para o winscp.exe.

Edição para incluir o seguinte:

Digamos que o winscp.exe não use códigos de saída para denotar sucesso ou falha. Você pode precisar fazer algo diferente.

winscp.exe /log=%temp%\wscpresults.log *other parameters here*
ping -n 300 -w 1000 127.0.0.1 > nul
find /i "success" %temp%\wscpresults.log
if errorlevel 0 goto end
call done.bat
:end

Onde:

  • O comando ping realiza apenas 5 minutos (300 x 1000ms ou 1 segundo = 5 minutos)
  • A opção / log faz com que o winscp.exe grave os resultados da operação em um arquivo.
  • O comando find procura a palavra sucesso - não tenho idéia do que o winscp realmente grava no arquivo, você teria que tentar uma vez e identificar a string que mostra tudo funcionou, e então modificar a string que encontrar pesquisas por para isso.
  • Se o comando find não encontrar a palavra "success", vá para o rótulo "end" sem chamar o done.bat. Caso contrário, achamos que tudo foi bem sucedido e chamamos de done.bat.
por 24.08.2012 / 21:28