在Ruby中执行外部程序并等待其执行

10

如何用ruby启动外部程序(如Excel表格),并在其执行或终止之前等待。

我知道可以使用以下代码启动Excel:

system 'start excel "my/path/to/the/sheet"' 

但是使用这个只会开始表格然后继续。

3个回答

9

你遇到的问题不是Ruby,而是启动命令,它会启动另一个程序并立即返回。你需要让该命令等待Excel完成使用 wait 标志:

system('start /wait excel "my/path/to/the/sheet"')

3

不要使用start命令!命令system会等待结果。在Windows提示符下,start命令会异步启动程序。

system 'excel yout/path/sheet'

或者您也可以使用%x,如果您想要一个数组作为结果:
%x{ ls }

如果您的命令中包含“start”命令,则%x无论如何都会等待输出。

没有启动Excel表格的情况下,它无法打开。 - Sebastian Müller
你可以将参数传递给_system_。例如:_system 'excel','path_to_sheet'_。 - kisp
使用该方法不会打开Excel表格。 - Sebastian Müller
打开 Excel 表格立即返回 true。 - Sebastian Müller

2
如前所述,省略"start"将会导致Ruby脚本等待执行。
system("notepad.exe")

在Ruby中另外一种方法是使用反引号。

`notepad.exe` # Same effect. Will also accept #{} variable insertion 

然而,您提到了Excel作为一个例子。如果您打开一个普通的Windows命令提示符,您会注意到,虽然start excel path\to\sheet可以打开Excel,但只有excel path\to\sheet是不行的。您将收到一个关于"excel"不是一个已识别的内部或外部命令的错误。修复此问题的方法是将Excel路径添加到您的环境变量中,或在您的system()调用中包含Excel路径。
EXCEL = File.join("C:", "Program Files", 
    "Microsoft Office", "OFFICE11", "excel.exe")
`"#{EXCEL}" "path\to\sheet"` 

(在这里使用反引号只是我的个人喜好。我喜欢它,因为它可以插入变量。) 这将打开一个 Excel 实例,Ruby 脚本将等待应用程序终止。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接