5

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

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

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

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

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

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

2 ответа2

5

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

 start /wait winscp ...
 call done.bat

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


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

4

Измените файл 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 ищет слово success - я понятия не имею, что на самом деле winscp записывает в файл, вам придется один раз попробовать его и определить строку, которая показывает, что все работает, а затем изменить строку, в которой поиск выполняет поиск.
  • Если команда find не находит слово "success", перейдите к метке "end", не вызывая done.bat. В противном случае мы думаем, что все прошло успешно, и мы называем done.bat.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .