Пакетный файл, вызванный из Javascript / XPCOM, не показывает окно командной строки - PullRequest
4 голосов
/ 22 ноября 2008

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

Ответы [ 7 ]

2 голосов
/ 23 ноября 2008

Единственное решение, которое я слышал до сих пор (это должно сработать, хотя я еще этого не сделал, исходит от Mook на канале IRC Mozilla xulrunner:

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

например, psuedocode:

f = fopen("temp.bat"); 
fprintf(f, "other.bat 1 2 3 4 5"); 
fclose(f); 
exec("temp.bat");

не очень элегантно, но должно работать.

1 голос
/ 23 ноября 2008

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

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

Это должно иметь " такой же эффект, как если бы вы дважды щелкнули файл ."

0 голосов
/ 25 марта 2013

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

    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
    }

и в моем командном файле Window я сделал:

@ECHO OFF
START "application.exe" %1

с помощью START позволил мне запустить приложение и закрыть окно командной строки

0 голосов
/ 18 июля 2011

Для 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>
0 голосов
/ 10 февраля 2011

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

function runBatch(){
    var exe = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
    exe.initWithPath("***C:\&nbsp;\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 в init ???

Спасибо

0 голосов
/ 15 августа 2009

Этот фрагмент кода работает нормально. Конечно, вы должны изменить 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);
0 голосов
/ 18 марта 2009

Пффф, очень уродливый код .. Намного приятнее использовать 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);

приятнее и работает:)

...