Я вызываю командный файл из Javascript следующим образом:
function runBatch(){
var exe = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
exe.initWithPath("C:\\test.bat");
var run = Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess);
run.init(exe);
var parameters = ["hi"];
run.run(false, parameters,parameters.length);
}
мой тестовый пакетный файл:
echo on
echo %1
pause
exit
Однако каждый раз, когда я вызываю командный файл, командная строка не отображается, как было бы, если бы я просто запускал командный файл с рабочего стола. Как я могу исправить это и отобразить командную строку для командного файла?
Редактировать Чтобы было понятно, запускается процесс cmd.exe - я его вижу в панели задач. Но ни одно окно не отображается. Этот фрагмент ведет себя аналогичным образом:
function runCmd(){
var exe = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
exe.initWithPath("C:\\WINDOWS\\system32\\cmd.exe");
var run = Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess);
run.init(exe);
run.run(false, null,0);
}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы пробовали использовать метод запуска nsiLocalFile?
function runBatch(){
var exe = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
exe.initWithPath("C:\\test.bat");
exe.launch();
}
Здесь должно быть «такой же эффект, как если бы вы дважды щелкнули файл».
да. - это откроется и покажет окно, но не позволит мне передать параметры / аргументы (которые я не упомянул в своем вопросе)
Это заставило меня ... создать ярлык с определенными параметрами, и я могу вызвать ярлык с помощью nsiLocalFile ... и командные файлы будут запущены. Но я хочу, чтобы параметры были динамическими.
Есть ли способ создать ярлык на лету?
Единственное решение, которое я слышал до сих пор (оно должно сработать, хотя я еще не сделал этого, исходит от Mook в IRC-канале Mozilla xulrunner:
Создайте временный пакетный файл, записывающий в пакетный файл для вызова и аргументы для его передачи. затем запустите временный командный файл.
например, псевдокод:
f = fopen("temp.bat");
fprintf(f, "other.bat 1 2 3 4 5");
fclose(f);
exec("temp.bat");
не очень элегантно, но должно работать.
Пфф, очень уродливый код .. Гораздо более приятный трюк - использовать Win.com для создания 16-битной подсистемы командной строки. Win.com отправит консоль в правый виртуальный терминал, показывая вам результат.
var lPath = getWorkingDir.path + "\\..\\..\\WINDOWS\\system32\\win.com";
lFile.initWithPath(lPath);
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(lFile);
var args = ["cmd.exe"];
process.run(false, args, args.length);
Приятнее и работает :)
Этот фрагмент кода работает нормально. Конечно, вам нужно изменить D: \ Windows \ system32 \ на путь к cmd.exe в вашей операционной системе.
const FileFactory = new Components.Constructor("@mozilla.org/file/local;1","nsILocalFile","initWithPath");
var str_LocalProgram = "D:\\Windows\\system32\\cmd.exe";
var obj_Program = new FileFactory(str_LocalProgram);
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(obj_Program);
var args = ["/C", "regedit.exe"];
process.run(true, args, args.length);
@ 0A0D, чтобы убедиться, что код, предшествующий process.run, будет выполнен. после были внесены изменения.
Вы делаете правильно, но исправьте это:
function runBatch(){
var exe = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
exe.initWithPath("***C:\ \test.bat***");
var run = Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess);
run.init(exe);
var parameters = ["hi"];
run.run(false, parameters,parameters.length);
}
Если вы это сделаете ???
function runBatch(){
var exe = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
exe.initWithPath("***C:\test.bat***");
var run = Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess);
run.init(exe);
var parameters = ["hi"];
run.run(false, parameters,parameters.length);
}
Отключить @echo при инициализации ???
Спасибо
Для Linux:
<script>
function callLight2()
{
netscape.security.PrivilegeManager.enablePrivilege(
'UniversalXPConnect'
);
var exe = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
// exe.initWithPath(C:\\Windows\\system32\\cmd.exe"");
exe.initWithPath("/usr/bin/gnome-terminal");
var run = Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess);
run.init(exe);
var parameters = ["-e", "/usr/bin/ip_connect_up.sh 2 2 3 4 5 6"];
// var parameters = ["/C", "regedit.exe"];
// var parameters = ["hi"];
run.run(true, parameters,parameters.length);
}
</script>
<a href = "#" onClick = "callLight2()">start</a>
Это вопрос Windows
Мне пришлось запустить командный файл и передать аргумент. Вот как я это сделал:
let file = uri.QueryInterface(Components.interfaces.nsIFileURL).file;
let run = Components.classes['@mozilla.org/process/util;1']
.createInstance(Components.interfaces.nsIProcess);
let path = file.path;
if (file.exists())
{
// quick security check
if (file.isExecutable())
{
// show error message
return;
}
let localfile = file.QueryInterface(Components.interfaces.nsILocalFile);
if (localfile != null)
{
if (app == "app1")
{
localfile.initWithPath("C:\\app1.bat");
}
else
{
localfile.initWithPath("C:\\app2.bat");
}
run.init(localfile);
var parameters = [path];
run.run(false, parameters, parameters.length);
}
else
{
// show error message
}
}
else
{
// show error message
}
и в моем командном файле Windows я сделал:
@ECHO OFF
START "application.exe" %1
с помощью START, позволил мне запустить приложение и закрыть окно командной строки
FWIW, ваш первый фрагмент отлично подходит для Vista и Firefox 3.6.