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ù: