Запустите программу в пакетном скрипте и дождитесь ее завершения, прежде чем продолжить

У меня есть очень специфическое требование. Я пытаюсь загрузить файлы через sftp, который использует закрытые ключи. У меня уже есть файл bat, который подключается к хосту и загружает файл, однако мне нужно переместить загруженные файлы после завершения на другой путь.

Первый файл bat называется start.bat . Это подключается к серверу sftp и загружает файл. Я использую winscp для подключения к хосту.

Второй файл bat называется done.bat . Это перемещает файлы из одного каталога в другой.

Я call done.bat второй файл bat с первого, используя call done.bat . Проблема в том, что done.bat завершен еще до того, как первый командный файл имел возможность аутентифицироваться, загружаться и загружаться.

Я хочу только переместить файл после завершения загрузки. Если загрузка по какой-либо причине не выполняется, второй файл не выполняется.

Файлы bat находятся на компьютере под управлением Windows XP.

Используйте start /wait winscp ... чтобы начать передачу файла, это приостановит пакетный скрипт до тех пор, пока winscp не выйдет, вы можете добавить команды перемещения после этой строки или call done.bat

  start /wait winscp ... call done.bat 

Вы должны объединить это с ошибкой, предложенной Марком Алленом


Лично я использовал бы клиент SFTP-сервера командной строки (например, тот, который поставляется с Putty или OpenSSH), который, я думаю, избежал бы такой проблемы.

Измените start.bat, чтобы обнаружить сбой со стороны winscp.exe. Только вызов done.bat, если winscp.exe завершает работу с кодом выхода 0.

Попробуйте что-то вроде этого:

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

Обратите внимание, что я допускаю, что выходы winscp.exe с ошибкой 1 или больше. Проверьте документацию на winscp.exe.

Редактирование включает следующее:

Предположим, что winscp.exe не использует коды выхода для обозначения успеха или неудачи. Возможно, вам нужно будет сделать что-то другое.

 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 

Где:

  • Команда ping не выполняет ничего, кроме как ждать 5 минут (300 x 1000 мс или 1 секунда = 5 минут)
  • Переключатель / log заставляет winscp.exe записывать результаты операции в файл.
  • Команда find ищет успех слова – я понятия не имею, что winscp на самом деле пишет в файл, вам придется попробовать его один раз и определить строку, в которой все работает, а затем изменить строку, которая находит поиск для этого.
  • Если команда find не находит слово «успех», перейдите на метку «end», не называя done.bat. В противном случае мы думаем, что все преуспело, и мы называем done.bat.
  • Сжимает ли файлы в XP замедляет работу?
  • Службы Java перестают работать, когда пользователь выходит из системы
  • Как найти время работы в Windows?
  • Как преобразовать файл MS Word 2007 в файл JPG?
  • Как восстановить отсутствующую адресную строку проводника Windows?
  • Являются ли msa.exe и ygh.exe действительно вредоносными программами и что еще нужно сделать для очистки ПК?
  • Команда Windows XP поддерживает команду обрезки SSD?
  • Диспетчер задач показывает 100% загрузку процессора, но ничего в списке процессов не делает
  • Как я могу принудительно включить или отключить внутренний жесткий диск, когда захочу?
  • Как предотвратить скринсейвер
  • Как найти самые большие файлы и папки на диске?
  • Interesting Posts
    Давайте будем гением компьютера.