You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 17:55:07