使用WScript Shell调用pscp上传FTP时,如何捕获错误输出?
解决pscp错误信息无法捕获的问题
我明白你的痛点——当用VBA调用pscp上传文件时,成功的输出能正常写入日志,但遇到像Fatal: Server unexpectedly closed network connection这类错误时,日志文件里啥都没有。这是因为你只捕获了标准输出流(stdout),而错误信息其实是输出到**标准错误流(stderr)**里的,默认的>重定向只会处理stdout。
解决方案:合并标准输出和错误输出
要同时捕获成功日志和错误信息,你需要在命令里加上2>&1,这个语法的意思是把stderr(编号2)的内容重定向到stdout(编号1)的同一个输出目标里。同时你之前的引号拼接也有语法错误,需要修正。
修改后的命令拼接代码应该是这样:
' 合并stdout和stderr到同一个文件,修正引号语法 strCommand = strCommand & " > ""C:\output.txt"" 2>&1"
完整的修改后代码片段
这里把修正后的关键部分整合到你的原代码里,还修复了几个小问题:
Dim wsh As Object Dim waitOnReturn As Boolean Dim windowStyle As Integer Dim cstrSftp As String Dim strCommand As String Dim pUser As String Dim pPass As String Dim pHost As String Dim pFile As String Dim pRemotePath As String Dim site As String Dim resp As String Set wsh = VBA.CreateObject("WScript.Shell") waitOnReturn = True windowStyle = 1 ' 初始化变量,修复路径和密码的小问题 cstrSftp = """" & Application.ActiveWorkbook.Path & "\pscp.exe" & """" site = "http://mysite/" pUser = "user" pPass = "password" ' 移除了末尾多余的空格,避免登录失败 pHost = "ftp.mysite" pRemotePath = "/home/" pFile = """" & Application.ActiveWorkbook.Path & "\file.png" & """" ' 补充路径分隔符\,避免路径拼接错误 ' 构建基础上传命令 strCommand = "cmd /c echo n | " & cstrSftp & " -sftp -l " & pUser & " -pw " & pPass & " " & pFile & " " & pHost & ":" & pRemotePath ' 新增:合并输出流到日志文件,同时捕获成功和错误信息 strCommand = strCommand & " > ""C:\output.txt"" 2>&1" ' 执行命令 wsh.Run strCommand, windowStyle, waitOnReturn
额外提示
- 原代码里
pPass末尾多了一个空格,这可能导致登录认证失败,我已经帮你移除了; pFile的路径拼接缺少了路径分隔符\,会生成类似C:\WorkbookPathfile.png的错误路径,也已经修正。
这样修改后,不管上传成功还是失败,所有的输出(包括具体错误信息)都会写入到C:\output.txt里,你可以读取这个文件来判断上传状态,或者提取失败的具体原因。
内容的提问来源于stack exchange,提问作者Guilherme
相关产品推荐
相关产品推荐

