nsis !system 调用是否中断(调用 xcopy 时)?

Is nsis !system call broken (when calling xcopy)?

我正在使用最新的 3.0b2 版本并注意到通过 !system call 调用 xcopy 不起作用。

我有一个 xcopy 调用,它在通过命令行手动调用时运行完美,但在通过 !system 进行管道传输时无提示地失败。

(注意:我需要!system,因为这是一个编译时操作,必须成功才能打包数据)

这是一个示例 nsi 脚本

!system 'xcopy'
!error "just exit"

调用 xcopy 应该 return 一些关于无效参数计数等的输出,但 xcopy 完全没有提示。如果我用 robocopy 替换它,我会得到一些输出。

真正奇怪的是:我启动了 Process Monitor 并观察了有效 xcopy 调用的 Process Start,它是这样的:

xcopy "d:\tool\*.pdb" "d:\dest\"  /y /g /k /r /s /f

它复制了一切。但是后来我 运行 在 nsis 中与 !system 和 ProcMon 完全相同的行显示 完全 相同的进程启动调用。我区分了两个参数集、相同的工作目录、相同的命令行,但是通过 !system 的调用没有继续复制文件。 Procmon 甚至说第二次调用的退出代码为 0。

除了不复制文件外,一切都很酷。

XCopy 中的这个 seems to be a bug,如果没有有效的 StdIn 句柄,它将无法执行任何操作。这个错误似乎存在于几个使用未记录的 ulib.dll 库来处理其 input/output 的 Microsoft 工具中。

This Wine commit 声称 <= Win2003 需要控制台句柄,但匿名管道在 WinXP 上对我有用。

下一个 NSIS 版本将为 child 提供一个空的 StdIn 管道来解决这个错误,同时您可以使用:

!system 'xcopy < nul'

!system 'start /wait /min xcopy'