使用WScript.shell activeX执行命令行

时间:2013-03-12 01:02:04

标签: javascript cmd activex

我正在使用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时工作正常。

有没有人知道一个不仅运行和.exe但实际执行命令行的activeX?

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

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,但我不能在执行时使用填充路径。任何信息都有帮助。先感谢您。

2 个答案:

答案 0 :(得分:10)

根据以下内容:

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

你应该能够直接传递命令作为strCommand param的一部分,你可能最好摆脱包装整个命令和参数的额外引号:

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"');

答案 1 :(得分:3)

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

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

我的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"');