2016-02-24 7 views
5

Sto creando questa app HTA con JScript che scrive un file BAT e lo apre in cmd in seguito.Esecuzione di file batch da JScript in HTA

Se apro manualmente il file BAT creato da windows, funziona come dovrebbe.
Quando lo apro tramite il mio HTA, il file si apre ma emette solo Echo e mette in pausa.

Si prega di tenere presente, sono molto nuovo alla programmazione.

Ecco il JScript.

// Write the Bat file 
// When run from HTA all I get is the "Echo Done" and "Pause" 
// When I run from Windows without HTA, all of it works. 
function writeBat() { 
var fso = new ActiveXObject("Scripting.FileSystemObject"); 
var s = fso.CreateTextFile("C:/test/test.bat"); 
    s.WriteLine('@echo off'); 
    s.WriteLine('set output=C:/test/new/'); 
    s.WriteLine('FOR %%a in (*.mkv) DO ("C:/Program Files/MKVToolNix/mkvmerge.exe" -o "%output%%%~na.mkv" "%%a")'); 
    s.WriteLine('echo Done.'); 
    s.WriteLine('pause'); 
    s.Close(); } 

// Run the Bat file. 
function runBat() { 
var MyObject = new ActiveXObject("wscript.shell"); 
MyObject.Run("C:/test/test.bat"); } 

Questo è il file Batch.

@echo off 
set output=C:/test/new/ 
FOR %%a in (*.mkv) DO ("C:/Program Files/MKVToolNix/mkvmerge.exe" -o "%output%%%~na.mkv" "%%a") 
echo Done. 
pause 

E l'HTML

<form> 
<input type="button" value="Write Bat" onClick="writeBat()"> 
<input type="button" value="Run Bat" onClick="runBat()"> 
</form> 
+1

aggiungere uno 'echo% cd%' nel file batch per controllare la directory in esecuzione e, se necessario, aggiungere ulteriore riga 'pushd c: \ directory'. – npocmaka

+0

JavaScript e JScript mentre la sintassi è simile sono [non equivalenti] (http://stackoverflow.com/a/135256/692942). Quello che hai scritto qui è JScript. – Lankymart

+1

Come ho detto nel post, sono molto nuovo in questo. Grazie per aver chiarito la cosa di Jscript. Per quanto riguarda la risposta, '% cd%' mostra il percorso del desktop quindi ho aggiunto 's.WriteLine ('pushd"% ~ dp0 "');' in alto e funziona !! Grazie mille! – Jon

risposta

4

Bene, hai trovato la tua risposta. Il contesto dell'HTA si trova in una directory di lavoro diversa dal contesto dello script batch. Devi avere lo script batch cd o pushd a "%~dp0". Questo è piuttosto standard per gli script batch aggiunti ai menu di scelta rapida e così via.

s.WriteLine('pushd "%~dp0"'); 

... come avete già fatto è la soluzione corretta. Si dovrebbe anche

s.WriteLine('@echo off & setlocal'); 

... per limitare l'ambito delle variabili in questo script batch al runtime dello script batch stesso.


Ma il motivo principale per cui sto postando una risposta è allo scopo di fornire maggiori informazioni sul motore Chakra. Anche con IE9, 10, 11, Edge, qualunque sia installato, Windows Script Host mantiene il set di funzionalità esistente in JScript 5.7. Secondo MSDN documentation:

A partire da JScript 5.8, per impostazione predefinita, il motore di script JScript supporta il set di funzionalità della lingua così come era nella versione 5.7. Questo per mantenere la compatibilità con le versioni precedenti del motore. Per utilizzare il set completo di funzionalità linguistiche della versione 5.8, l'host dell'interfaccia di Windows Script deve richiamare IActiveScriptProperty::SetProperty.

Cosa che sta dicendo è, se si vuole utilizzare metodi in JScript 5.8 o più recente (come i metodi JSON, Object.keys, Array.prototype.forEach(), e così via), si deve fondamentalmente per scrivere il proprio Windows Script interprete Host. Ma, con HTA, c'è un trucco facile che abiliterà le funzionalità di IE9.È sufficiente aggiungere la seguente riga alla parte superiore del file HTA:

<meta http-equiv="x-ua-compatible" content="IE=9" /> 

Prima:

<script> 
function get() { 
    try { 
     var json = JSON.parse(document.getElementById('json').value); 
     alert(json.var1); 
    } 
    catch(e) { 
     alert(e.message); 
    } 
} 
</script> 
<textarea id="json">{"var1": "It works!"}</textarea> 
<button onclick="get()">Go!</button> 

uscita:

'JSON' è definito

Dopo:

<meta http-equiv="x-ua-compatible" content="IE=9" /> 
<script> 
function get() { 
    try { 
     var json = JSON.parse(document.getElementById('json').value); 
     alert(json.var1); 
    } 
    catch(e) { 
     alert(e.message); 
    } 
} 
</script> 
<textarea id="json">{"var1": "It works!"}</textarea> 
<button onclick="get()">Go!</button> 

uscita:

Funziona!


Questo mod non si limita al HTA, però. Può anche essere fatto funzionare per console JScript e JScript.NET creando un oggetto COM , scrivendo il tag <meta>, quindi copying the newly exposed methods and objects nell'host di script corrente.

+0

Grazie per l'input! Stavo leggendo da qualche parte che non dovrei farlo con a meno che non dovessi farlo. Sembra che posso saltare per questo progetto, può tornare utile per il prossimo. Grazie per il tempo che ci hai dedicato. – Jon