使用WScript.Shell隐藏执行cmd时,VBA输出重定向失效如何解决?
解决WScript.Shell隐藏窗口时重定向输出为空的问题
问题根源
你的代码存在几个核心问题,导致隐藏窗口(样式0)时输出文件为空:
- 用了
cmd /K参数:该参数会让cmd执行命令后保持窗口打开,但Run方法第三个参数设为false(异步执行),脚本会直接往下走,可能sftp进程还没完成输出就被终止。 - 仅重定向了标准输出(stdout):
sftp的部分输出(比如连接提示、错误信息)会写入标准错误流(stderr),这部分内容没被捕获写入文件。 - 交互模式阻塞:隐藏窗口下
sftp默认的交互模式无法正常运行,导致没有输出内容生成。
修正后的代码
Dim objShell : Set objShell = CreateObject("WScript.Shell") Dim cmd : cmd = "cmd /C sftp -b ""C:\your\path\sftp_cmds.txt"" " & sftpusername & "@" & sftpserver & " > output.txt 2>&1" Oresult = objShell.Run(cmd, 0, true)
关键修改说明
- 替换
/K为/C:执行完命令后自动关闭cmd进程,保证输出能正常写入文件。 - 添加
2>&1:把标准错误流的内容重定向到标准输出,让sftp的所有输出(包括错误信息)都能写入文件。 - 第三个参数改为
true:让脚本等待cmd命令执行完成后再继续,避免异步执行导致的输出不完整。 - 使用
sftp -b参数:指定sftp的批处理文件,以非交互模式运行,避免隐藏窗口下的交互阻塞(需提前编写好包含ls、get等操作的批处理文件)。
简化测试方案
如果只是测试连接输出,不需要执行复杂操作,可以用安静模式跳过交互:
Dim cmd : cmd = "cmd /C sftp -q " & sftpusername & "@" & sftpserver & " > output.txt 2>&1" Oresult = objShell.Run(cmd, 0, true)
内容的提问来源于stack exchange,提问作者Manoj
相关产品推荐
相关产品推荐

