2016-02-24 8 views
5

Ich erstelle diese HTA-App mit JScript, die eine BAT-Datei schreibt und anschließend in cmd öffnet.Batchdatei aus JScript in HTA ausführen

Wenn ich manuell die erstellte BAT-Datei von Windows öffne, funktioniert es wie es sollte.
Wenn ich es über meine HTA öffne, öffnet sich die Datei, gibt aber nur Echo und Pause aus.

Bitte beachten Sie, ich bin sehr, sehr neu in der Programmierung.

Hier ist das JScript.

Hier ist die Batch-Datei.

@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 

Und der HTML

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

Fügen Sie ein 'echo% cd%' in die Batch-Datei ein, um das laufende Verzeichnis zu überprüfen und fügen Sie bei Bedarf eine zusätzliche Zeile 'pushd c: \ directory' hinzu. – npocmaka

+0

JavaScript und JScript, während die Syntax ähnlich ist, sind [nicht äquivalent] (http://stackoverflow.com/a/135256/692942). Was Sie hier geschrieben haben, ist JScript. – Lankymart

+1

Wie ich in der Post gesagt habe, bin ich sehr neu dabei. Danke, dass du die Jscript-Sache aufgeklärt hast. Wie für die Antwort, '% cd%' zeigen den Pfad zum Desktop, also habe ich 's.WriteLine ('Pushd"% ~ dp0' '); 'an der Spitze und es funktioniert !! Ich danke dir sehr! – Jon

Antwort

4

Nun, gefunden Sie Ihre Antwort. Der Kontext der HTA befindet sich in einem anderen Arbeitsverzeichnis als der Kontext des Stapel-Skripts. Sie müssen das Stapelscript cd oder pushd zu "%~dp0" haben. Dies ist ziemlich Standard für Stapelskripts, die Kontextmenüs usw. hinzugefügt werden.

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

... wie Sie bereits getan haben, ist die richtige Lösung. Sie sollten auch

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

... selbst den Umfang der Variablen in diesem Batch-Skript, um die Laufzeit der Batch-Skript zu begrenzen.


Aber der Hauptgrund, warum ich eine Antwort bin Entsendung ist für die Zwecke der weiteren Informationen über den Motor Chakra bietet. Sogar mit IE9, 10, 11, Edge, was immer installiert wird, behält der Windows Script Host das Feature-Set bei, das in JScript 5.7 vorhanden war. Nach MSDN documentation:

Beginnend mit JScript 5.8, standardmäßig unterstützt die Skriptmodul JScript die Sprache Feature-Set, wie es in der Version 5.7 existierte. Dies dient dazu, Kompatibilität mit den früheren Versionen der Engine beizubehalten. Um den vollständigen Sprachenfeaturesatz von Version 5.8 zu verwenden, muss der Windows Script-Schnittstellenhost IActiveScriptProperty::SetProperty aufrufen.

Was das sagt, ist, wenn Sie Methoden in JScript 5.8 oder neuer (wie JSON Methoden, Object.keys, Array.prototype.forEach(), usw.) verwenden möchten, müssen Sie im Grunde Ihre eigene Windows Script Host-Interpreter schreiben. Aber mit HTA gibt es einen einfachen Hack, der IE9-Funktionen aktiviert.Fügen Sie einfach an die Spitze der HTA-Datei die folgende Zeile:

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

Bevor:

<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> 

Ausgang:

'JSON' nicht definiert ist

Nachher: ​​

<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> 

Ausgang:

Es funktioniert!


Dieser Hack ist HTA aber nicht darauf beschränkt. Es kann auch für die Konsolen JScript und JScript.NET erstellt werden, indem ein htmlfile COM-Objekt erstellt wird, das <meta>-Tag dazu geschrieben wird und dann copying the newly exposed methods and objects in den aktuellen Skript-Host.

+0

Vielen Dank für Ihre Eingabe! Ich las irgendwo, dass ich es nicht mit machen sollte, es sei denn, ich musste es tun. Scheint, ich kann es für dieses Projekt überspringen, kann für das nächste nützlich sein. Danke, dass du dir Zeit genommen hast. – Jon