在批处理脚本中运行程序并等待其完成后再继续

在批处理脚本中运行程序并等待其完成后再继续

我有一个非常具体的要求。我试图通过使用私钥的 sftp 上传文件。我已经有一个连接到主机并上传文件的 bat 文件,但是我需要在完成后将上传的文件移动到另一个路径。

第一个 bat 文件名为start.bat。这将连接到 sftp 服务器并上传文件。我使用 winscp 连接到主机。

第二个 bat 文件名为done.bat。它将文件从一个目录移动到另一个目录。

我正在使用从第一个批处理文件调用第二个批处理文件call done.bat。我遇到的问题是,done.bat甚至在第一个批处理文件有机会进行身份验证、登录和上传之前就已经完成了。

我希望仅在上传完成后才移动文件。如果由于某种原因上传失败,则不会执行第二个文件。

该 bat 文件位于 Windows XP 机器上。

答案1

用于start /wait winscp ...启动文件传输,这将暂停批处理脚本,直到 winscp 退出,您可以在该行后添加移动命令或call done.bat

 start /wait winscp ...
 call done.bat

您应该将其与建议的错误检查结合起来马克艾伦


我个人会使用命令行 SFTP 客户端(例如 Putty 或 OpenSSH 提供的客户端),我认为这可以避免此类问题。

答案2

修改 start.bat 以检测 winscp.exe 的故障。仅当 winscp.exe 以退出代码 0 退出时才调用 done.bat。

尝试这样的操作:

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 搜索的字符串。
  • 如果 find 命令未找到单词“success”,则转到“end”标签而不调用 done.bat。否则,我们认为一切都成功了,并调用 done.bat。

相关内容