如何在批处理脚本中捕获ftp错误代码?

如何在批处理脚本中捕获ftp错误代码?,ftp,batch-file,Ftp,Batch File,我有一些相关但不同的问题 我有一个批处理脚本(*.bat文件),如下所示: @ftp -i -s:"%~f0"&GOTO:EOF open ftp.myhost.com myuser mypassword !:--- FTP commands below here --- lcd "C:\myfolder" cd /testdir binary put "myfile.zip" disconnect bye 基本上,这是一个将zip文件上传到ftp站点的脚本。我的问题是,上传操作有时

我有一些相关但不同的问题

我有一个批处理脚本(
*.bat
文件),如下所示:

@ftp -i -s:"%~f0"&GOTO:EOF
open ftp.myhost.com
myuser
mypassword
!:--- FTP commands below here ---
lcd "C:\myfolder"
cd  /testdir
binary
put "myfile.zip"
disconnect
bye
基本上,这是一个将zip文件上传到ftp站点的脚本。我的问题是,上传操作有时会失败(远程ftp不可用,“myfile.zip”不存在,上传操作中断等等),当发生这种不幸的事情时,我希望我的bat文件返回1(
exit 1

如果我的上传不成功,ftp会抛出一个异常(是的,就像C++中的异常),我会有一个捕获所有异常的异常,然后
退出1
,但我认为这在批处理脚本中不可用


在这里做我需要的事情的最佳方法是什么?

据我所知,批处理文件中唯一的选项是使用“IF ERRORLEVEL”语法,这要求ftp客户端返回非零错误代码

是一个很好的参考指南


不幸的是,如果标准的Windows ftp客户端返回非零错误代码,我不会这样做,因此如果这是一项要求,您可能需要自己编写代码。建议它不返回错误代码,但通过将输出重定向到一个文件并使用FIND命令返回错误代码,提供了一种解决方法,尽管有些笨拙。

您可以将输出重定向到一个日志文件,当ftp会话结束时,可以解析该文件

@ftp -i -s:"%~f0" > log.txt & GOTO :parse
open ftp.myhost.com
myuser
mypassword
!:--- FTP commands below here ---
lcd "C:\myfolder"
cd  /testdir
binary
put "myfile.zip"
disconnect
bye

:parse
for /F "delims=" %%L in (log.txt) Do (
  ... parse each line
)

Windows FTP不返回任何代码

我建议运行一个批处理文件,将ftp命令回显到输入响应文件,然后使用此文件作为ftp命令的输入,将stderr重定向到文件并验证文件大小。像这样的

echo open ftp.myhost.com >ftpscript.txt
echo myuser >>ftpscript.txt
echo mypassword >>ftpscript.txt
echo lcd "C:\myfolder"  >>ftpscript.txt
echo cd  /testdir  >>ftpscript.txt
echo binary  >>ftpscript.txt
echo put "myfile.zip"  >>ftpscript.txt
echo disconnect  >>ftpscript.txt
echo bye  >>ftpscript.txt

ftp -i -s:ftpscript.txt >ftpstdout.txt 2>ftpstderr.txt 
rem check the ftp error file size, if 0 bytes in length then there was no erros
forfiles /p . /m ftpstderr.txt /c "cmd /c if @fsize EQU 0 del /q ftpstderr.txt"
if EXIST ftpstderr.txt (
   exit 1
)