2013-03-12 22 views
6

Sto lavorando per chiamare un file .exe con un activex WScript.shell. Il file è wkhtmltopdf.exe e viene utilizzato per convertire una pagina HTML in un file .pdf. Tutto funziona bene quando sto chiamando C: \ wkhtmltopdf.exe nel codice. Funziona e poi si chiude correttamente. Ma il mio problema è che è necessario eseguirlo da cmd con il nome del programma, quindi il nome del file HTML che si sta leggendo seguito dal nome .pdf che si desidera venga creato come.Utilizzo di un activeX WScript.shell per eseguire una riga di comando

Ad esempio:

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

Questo chiamerà wkhtmltopdf.exe, leggere c: \ PDFTestPage.html, quindi creare c: \ test.pdf. Funziona bene quando lo digito in cmd.

Qualcuno conosce un activeX che non eseguirà solo .exe ma eseguirà effettivamente una riga di comando?

Ecco il mio codice che sto attualmente utilizzando.

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

Vorrei davvero che fosse il seguente.

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

Anche nota a margine. Per qualche motivo non posso lanciare l'exe da un percorso assoluto. Devo passare alla directory e quindi digitare wkhtmltopdf.exe. Il percorso di riempimento è il seguente:

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

Realmente lavoro solo con UNIX quindi non sono sicuro degli spazi nel percorso. Posso fare un chdir con gli spazi ma non posso usare il percorso di riempimento quando lo eseguo. Qualsiasi informazione sarebbe utile. Grazie in anticipo.

+0

Perché non fare un semplice cgi che lo fa ed evitare ActiveX che è solo con IE e un incubo di autorizzazioni? – epascarello

+0

Questo deve essere eseguito su una rete intranet e IE è sempre il browser predefinito. – JoBaxter

risposta

9

Secondo il seguente:

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

Si dovrebbe essere in grado di passare i comandi direttamente come parte del strCommand param, si sarebbe probabilmente meglio a sbarazzarsi delle citazioni in più che avvolgono l'intera il comando e gli argomenti:

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

Inoltre, si dovrebbe essere in grado di gestire gli spazi nei percorsi avvolgendo ogni elemento tra virgolette, in questo modo:

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

Si dovrebbe anche tenere a mente se si desidera bWaitOnReturn o meno, e quale intWindowStyle è necessario (alcuni eseguibili possono beneficiare di uno stile particolare).

Anche come nota di avviso — è passato un po 'di tempo da quando ho usato WScript.shell — ma potrebbe essere necessario sfuggire alle barre rovesciate nei percorsi. Quindi, un percorso può avere bisogno di simile al seguente:

objShell.run('"C:\\Program Files (x86)\\wkhtmltopdf\\wkhtmltopdf.exe"'); 
+0

Sì, è necessario evitare i backslash. –

3

Per chiunque altro che si imbatte in questo problema, ho avuto un simile (ma leggermente diverso) problema che ho pensato di condividere.

Anch'io volevo eseguire un comando utilizzando ActiveXObject("WScript.shell. Avevo bisogno di eseguire uno script .bat che avviava Google Chrome a un URL specifico.

Il JS ho avuto è stato il seguente:

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

Questo avrebbe lanciato correttamente il mio .bat script che era molto semplice:

start "" chrome.exe %1 

La questione mi sono imbattuto era che MY_URL conteneva alcuni parametri di query e quando ho usato il JS di cui sopra, i parametri della query sarebbero stati spogliati in una certa misura. Così, quando stavo cercando di aprire

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

sarebbe effettivamente aperto

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

La correzione si è rivelata semplice - ho dovuto circondare MY_URL tra virgolette. Così ho modificato la linea

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

essere

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