2013-03-12 26 views
6

Pracuję nad wywołaniem pliku .exe przy pomocy skryptu WScript.shell activeX. Plik to wkhtmltopdf.exe i służy do konwersji strony HTML do pliku .pdf. Wszystko działa dobrze, gdy po prostu wywołuję kod C: \ wkhtmltopdf.exe w kodzie. Działa, a następnie zamyka się prawidłowo. Ale moim problemem jest to, aby uruchomić go z cmd z nazwą programu, a następnie nazwę pliku HTML, który czytasz, a następnie nazwę .pdf, którą chcesz utworzyć jako.Używanie obiektu WScript.shell activeX do uruchamiania wiersza polecenia

Na przykład:

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

Ten wkhtmltopdf.exe zadzwoni, przeczytaj c: \ PDFTestPage.html, a następnie utworzyć c: \ test.pdf. Działa dobrze, gdy wpisuję go w cmd.

Czy ktoś wie, activeX, który nie będzie po prostu uruchomić i. Exe, ale faktycznie wykonać wiersz polecenia?

Oto mój kod, którego obecnie używam.

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

Naprawdę podoba mi się, że jest następujący.

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

Uwaga dodatkowa. Z jakiegoś powodu nie mogę uruchomić .exe z absolutnej ścieżki. Muszę przejść do katalogu, a następnie po prostu wpisać w wkhtmltopdf.exe. Ścieżka wypełnienia to:

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

Naprawdę działam tylko z systemem UNIX, więc nie jestem pewien co do spacji na ścieżce. Mogę zrobić chdir ze spacjami, ale nie mogę użyć ścieżki wypełnienia podczas jej wykonywania. Wszelkie informacje byłyby pomocne. Z góry dziękuję.

+0

Dlaczego nie można zrobić prosty CGI, który robi to i uniknąć ActiveX, który jest tylko IE i uprawnienia koszmar? – epascarello

+0

To musi działać w intranecie, a IE zawsze jest domyślną przeglądarką. – JoBaxter

Odpowiedz

9

według następujących:

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

Powinieneś być w stanie przekazać polecenia bezpośrednio jako część strCommand param, to pewnie lepiej pozbyć się dodatkowych cytatów owijanie całej karty polecenia i argumenty:

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

także powinieneś być w stanie obsłużyć spacje w ścieżkach owijając każdą pozycję w cudzysłowie, tak jak poniżej:

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

Należy również pamiętać, czy chcesz uzyskać bWaitOnReturn, czy też nie, a które intWindowStyle potrzebujesz (niektóre pliki wykonywalne mogą korzystać z określonego stylu).

Również jako przestroga minęło trochę czasu odkąd użyłem WScript.shell —, ale może być konieczne uciec od ukośników wstecz na twoich ścieżkach. Tak droga, konieczne może wyglądać następująco:

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

Tak, musisz uciec od ukośników. –

3

dla nikogo, że napotka ten problem, miałem podobny (ale nieco inny) problem, że myślałem, że dzielić.

Ja także chciałem uruchomić polecenie, używając ActiveXObject("WScript.shell. Musiałem uruchomić skrypt .bat, który uruchamia Google Chrome pod konkretny adres URL.

JS miałem był następujący:

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

To właściwie uruchomić mój .bat skrypt, który był bardzo prosty:

start "" chrome.exe %1 

Kwestia natknąłem było to, że MY_URL zawierał pewne parametry zapytania i kiedy użyłem powyższego JS, parametry zapytania zostaną rozebrane do pewnego stopnia. Więc kiedy próbuje otworzyć

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

prawda rzeczywiście otwarte

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

Rozwiązaniem okazała się prosta - miałem otoczyć MY_URL w cudzysłowach. Więc zmodyfikowano linię

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

być

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