Пакетный файл, вызываемый из Javascript / XPCOM, не отображает окно командной строки

Я вызываю командный файл из 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);
}

FWIW, ваш первый фрагмент отлично подходит для Vista и Firefox 3.6.

Nickolay 05.05.2010 01:16
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
4
1
6 114
7

Ответы 7

Вы пробовали использовать метод запуска nsiLocalFile?

function runBatch(){
    var exe = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
    exe.initWithPath("C:\\test.bat");
    exe.launch();
}

Здесь должно быть «такой же эффект, как если бы вы дважды щелкнули файл».

да. - это откроется и покажет окно, но не позволит мне передать параметры / аргументы (которые я не упомянул в своем вопросе)

pc1oad1etter 23.11.2008 05:06

Это заставило меня ... создать ярлык с определенными параметрами, и я могу вызвать ярлык с помощью nsiLocalFile ... и командные файлы будут запущены. Но я хочу, чтобы параметры были динамическими.

pc1oad1etter 23.11.2008 05:08

Есть ли способ создать ярлык на лету?

ng.mangine 23.11.2008 13:34

Единственное решение, которое я слышал до сих пор (оно должно сработать, хотя я еще не сделал этого, исходит от 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, будет выполнен. после были внесены изменения.

izogfif 26.03.2013 17:06

Вы делаете правильно, но исправьте это:

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

user195488 26.03.2013 04:39

Мне пришлось запустить командный файл и передать аргумент. Вот как я это сделал:

    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, позволил мне запустить приложение и закрыть окно командной строки

Другие вопросы по теме