2016-02-24 5 views
5

Я создаю это приложение HTA с JScript, которое записывает файл BAT и открывает его в cmd.Запуск пакетного файла от JScript в HTA

Если я вручную открываю созданный BAT-файл из окон, он работает так, как должен.
Когда я открываю его через свой HTA, файл открывается, но выводит только эхо и паузу.

Пожалуйста, имейте в виду, я очень новичок в программировании.

Это 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"); } 

Описание Пакетный файл.

@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 

И HTML

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

добавить один 'echo% cd%' в пакетном файле, чтобы проверить текущий каталог и при необходимости добавить дополнительную строку 'pushd c: \ directory'. – npocmaka

+0

JavaScript и JScript, когда синтаксис подобен, [не эквивалентны] (http://stackoverflow.com/a/135256/692942). Здесь вы написали JScript. – Lankymart

+1

Как я уже сказал в сообщении, я очень новичок в этом. Спасибо, что прояснил тему Jscript. Что касается ответа, '% cd%' показывает путь к рабочему столу, поэтому я добавил 's.WriteLine ('pushd"% ~ dp0 "');' наверху и он работает !! Спасибо огромное! – Jon

ответ

4

Ну, вы нашли свой ответ. Контекст HTA находится в другом рабочем каталоге из контекстного сценария пакетного сценария. У вас должен быть пакетный скрипт cd или pushd до "%~dp0". Это довольно стандартно для пакетных скриптов, добавленных в контекстные меню и т. Д.

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

... как вы уже сделали, это правильное решение. Вы также должны указать

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

... чтобы ограничить область действия переменных в этом командном скрипте исполняемой средой самого сценария партии.


Но основная причина, по которой я отправляю ответ, заключается в предоставлении дополнительной информации о двигателе Чакры. Даже с IE9, 10, 11, Edge, независимо от того, что установлено, хост Windows Script поддерживает набор функций, как он существовал в JScript 5.7. По MSDN documentation:

Начиная с JScript 5.8, по умолчанию, скриптовый движок JScript поддерживает функцию языка установить, как она существовала в версии 5.7. Это должно поддерживать совместимость с более ранними версиями движка. Чтобы использовать полный набор функций языка версии 5.8, хост интерфейса сценария Windows должен вызывать IActiveScriptProperty::SetProperty.

Что это говорит, что если вы хотите использовать методы в JScript 5.8 или более поздней версии (такие как методы JSON, Object.keys, Array.prototype.forEach(), и так далее), вы в основном должны написать свой собственный интерпретатор сценариев Windows Script Host. Но с HTA есть простой взлом, который позволит использовать функции IE9.Просто добавьте следующую строку в верхней части файла HTA:

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

Выход:

'JSON' неопределен

После:

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

Выход:

Это работает!


Этот хак не ограничивается ОМТ, хотя. Также можно заставить работать на консоли JScript и JScript.NET, создав COM-объект htmlfile, введя в него тег <meta>, затем copying the newly exposed methods and objects в текущий хост сценария.

+0

Спасибо вам за ввод! Я читал somwhere, что я не должен делать это с , если только не пришлось. Кажется, я могу пропустить это для этого проекта, может стать удобным для следующего. Спасибо, что нашли время. – Jon

Смежные вопросы