6

我正在使用 WScript.shell activeX 调用 .exe 文件。该文件是 wkhtmltopdf.exe,用于将 HTML 页面转换为 .pdf。当我在代码中调用 C:\wkhtmltopdf.exe 时,一切都运行良好。它运行然后正确关闭。但我的问题是您需要从 cmd 使用程序名称运行它,然后是您正在阅读的 HTML 文件名,然后是您希望将其创建为的 .pdf 名称。

例如:

c:\wkhtmltopdf.exe c:\PDFTestPage.html c:\TEST.pdf

这将调用 wkhtmltopdf.exe,读取 c:\PDFTestPage.html,然后创建 c:\TEST.pdf。当我将它输入cmd时工作正常。

有谁知道一个activeX,它不仅会运行和.exe,而且会实际执行命令行?

这是我目前正在使用的代码。

function callShellApplication(){
var objShell = new ActiveXObject("WScript.shell");
objShell.run('"c:\wkhtmltopdf.exe"');
}

真的希望它是以下。

function callShellApplication(){
var objShell = new ActiveXObject("WScript.shell");
objShell.run('"c:\wkhtmltopdf.exe c:\PDFTestPage.html c:\TEST.pdf"');
}

还有旁注。出于某种原因,我无法从绝对路径启动 .exe。我必须移动到目录,然后输入 wkhtmltopdf.exe。填充路径为:

C:\Program Files (x86)\wkhtmltopdf\wkhtmltopdf.exe

我真的只使用 UNIX,所以我不确定路径中的空格。我可以用空格做一个 chdir,但在执行它时我不能使用填充路径。任何信息都有帮助。先感谢您。

4

2 回答 2

10

根据以下:

http://msdn.microsoft.com/en-us/library/d5fk67ky%28v=vs.84%29.aspx

您应该能够直接将命令作为strCommand参数的一部分传递,最好去掉包裹整个命令和参数的额外引号:

function callShellApplication(){
  var objShell = new ActiveXObject("WScript.shell");
  objShell.run('c:\wkhtmltopdf.exe c:\PDFTestPage.html c:\TEST.pdf');
}

此外,您应该能够通过将每个项目括在引号中来处理路径中的空格,如下所示:

function callShellApplication(){
  var objShell = new ActiveXObject("WScript.shell");
  objShell.run('"C:\Program Files (x86)\wkhtmltopdf\wkhtmltopdf.exe" "c:\PDFTestPage.html" "c:\TEST.pdf"');
}

您还应该记住您是否愿意bWaitOnReturn,以及intWindowStyle您需要哪些(某些可执行文件可能会受益于特定样式)。

也只是作为一个警告 - 我已经有一段时间没有使用了WScript.shell- 但你可能需要在你的路径中转义你的反斜杠。因此,路径可能需要如下所示:

objShell.run('"C:\\Program Files (x86)\\wkhtmltopdf\\wkhtmltopdf.exe"');
于 2013-03-12T01:24:22.380 回答
3

对于遇到此问题的其他人,我有一个类似(但略有不同)的问题,我认为我会分享。

我也想使用ActiveXObject("WScript.shell. 我需要运行一个.bat将 Google Chrome 启动到特定 URL 的脚本。

我的JS如下:

var objShell = new ActiveXObject("WScript.shell");
objShell.run('"C:\\Scripts\\MyChromeBat.bat" MY_URL');

这将正确启动我的.bat脚本,这非常简单:

start "" chrome.exe %1

我遇到的问题是MY_URL包含一些查询参数,当我使用上面的 JS 时,查询参数会在一定程度上被剥离。所以当我试图打开

http://localhost:8080/webapp/mypage.html?param1=test&param2=test2

它实际上会打开

http://localhost:8080/webapp/mypage.html?param1

修复结果很简单——我不得不MY_URL用引号括起来。所以我修改了这条线

objShell.run('"C:\\Scripts\\MyChromeBat.bat" MY_URL');

成为

objShell.run('"C:\\Scripts\\MyChromeBat.bat" "MY_URL"');
于 2015-01-20T16:27:04.607 回答