4

我以这种方式从 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);
}
4

7 回答 7

2

到目前为止,我听到的唯一解决方案(应该可以,虽然我还没有这样做,但它来自 Mozilla xulrunner IRC 频道中的 Mook:

创建一个临时批处理文件,写入要调用的批处理文件和传递它的参数。然后执行临时批处理文件。

例如伪代码:

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

不是很优雅,但它应该可以工作。

于 2008-11-23T02:10:52.583 回答
1

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

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

这应该具有“与双击文件相同的效果”。

于 2008-11-23T00:15:10.850 回答
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);
于 2009-08-15T17:07:25.187 回答
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 关闭???

谢谢

于 2011-02-10T16:23:09.687 回答
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,允许我启动应用程序并关闭命令行窗口

于 2013-03-25T17:25:36.007 回答
-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>
于 2011-07-18T12:23:20.887 回答
-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);

更好,并且有效:)

于 2009-03-17T23:15:51.077 回答