Exécutez un programme dans un script de lot et attendez qu'il soit terminé avant de continuer

J'ai une exigence très précise. Je tente de télécharger des fichiers via sftp qui utilise des clés privées. J'ai déjà un fichier bat qui se connecte à l'hôte et télécharge le fichier, mais j'ai besoin de déplacer les fichiers téléchargés une fois achevé vers un autre chemin.

Le premier fichier bat est appelé start.bat . Cela se connecte au serveur sftp et télécharge le fichier. J'utilise winscp pour me connecter à l'hôte.

Le second fichier de chauve-souris s'appelle done.bat . Cela déplace les fichiers d'un répertoire à l'autre.

call done.bat le deuxième fichier de chauve-souris à partir du premier en utilisant l' call done.bat . Le problème que je possède est que done.bat est terminé avant même que le premier fichier batch ait eu la possibilité de s'authentifier, de se connecter et de télécharger.

Je souhaite déplacer uniquement le fichier une fois le téléchargement terminé. Si le téléchargement échoue pour une raison quelconque, le second fichier ne s'exécute pas.

Les fichiers bat sont sur une machine Windows XP.

Utilisez start /wait winscp ... pour démarrer le transfert de fichier, cela mettra en pause le script de lot jusqu'à la sortie de winscp, vous pouvez ajouter les commandes de déplacement après cette ligne ou call done.bat

  start /wait winscp ... call done.bat 

Vous devriez combiner cela avec la vérification des erreurs suggérée par Mark Allen


Personnellement, j'utiliserais un client SFTP de ligne de commande (comme celui fourni avec Putty ou OpenSSH), ce qui, je pense, éviterait ce type de problème.

Modifiez start.bat pour détecter une défaillance de la partie de winscp.exe. Appelez seulement done.bat si winscp.exe sort avec un code de sortie de 0.

Essayez quelque chose comme ceci:

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

Notez que je suppose que winscp.exe sort avec 1 ou plus lors d'une erreur. Vérifiez la documentation pour winscp.exe.

Modification pour inclure ce qui suit:

Disons que winscp.exe n'utilise pas les codes de sortie pour désigner le succès ou l'échec. Vous devrez peut-être faire quelque chose de différent.

 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 

Où:

  • La commande de ping accomplit rien d'autre que d'attendre 5 minutes (300 x 1000 ms ou 1 seconde = 5 minutes)
  • Le commutateur / log permet à winscp.exe d'écrire les résultats de l'opération dans un fichier.
  • La commande find recherche le mot succès – Je n'ai aucune idée de ce que winscp écrit réellement sur le fichier, il faut l'essayer une fois et identifier la chaîne qui montre tout ce qui a fonctionné, puis modifiez la chaîne qui recherche des recherches.
  • Si la commande find ne trouve pas le mot «succès», passez à l'étiquette «fin» sans appeler done.bat. Sinon, nous pensons que tout a réussi et nous appelons done.bat.