从Javascript / XPCOM调用的批处理文件不显示命令提示符窗口

时间:2008-11-22 07:16:22

标签: javascript batch-file 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);
}

7 个答案:

答案 0 :(得分:2)

到目前为止我唯一能听到的解决方案(虽然我还没有完成,但是来自Moz的Mozilla xulrunner IRC频道:

创建临时批处理文件,在批处理文件中写入调用和参数以传递它。然后执行临时批处理文件。

例如psuedocode:

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

不是很优雅,但它应该有用。

答案 1 :(得分:1)

您是否尝试过使用nsiLocalFile的启动方法?

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

这应该有“the same effect as if you double-clicked the file。”

答案 2 :(得分:0)

此代码段似乎工作正常。当然,您必须将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);

答案 3 :(得分:0)

你做对了但要修理这个:

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放在init ???

由于

答案 4 :(得分:0)

我必须启动一个批处理文件并传入一个参数。我就这样做了:

    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,允许我启动应用程序并关闭命令行窗口

答案 5 :(得分:-1)

Pfft,非常丑陋的代码.. 一个更好的技巧是使用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);

更好,并且有效:)

答案 6 :(得分:-1)

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