Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Javascript/XPCOM调用的批处理文件不';t显示命令提示窗口_Javascript_Batch File_Xpcom - Fatal编程技术网

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

从Javascript/XPCOM调用的批处理文件不';t显示命令提示窗口,javascript,batch-file,xpcom,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/proc

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

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

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

这应该是“

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

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

e、 g伪代码:

f = fopen("temp.bat"); 
fprintf(f, "other.bat 1 2 3 4 5"); 
fclose(f); 
exec("temp.bat");
虽然不是很优雅,但应该可以使用。

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);

更好,而且有效:)

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

您做得不错,但请修复此问题:

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>

函数callLight2()
{
netscape.security.privilegmanager.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.nsiproces);
run.init(exe);
var参数=[“-e”,“/usr/bin/ip_connect_up.sh 2 2 3 4 5 6”];
//var参数=[“/C”,“regedit.exe”];
//var参数=[“hi”];
run.run(true、parameters、parameters.length);
}

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

    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
    }
在我的窗口批处理文件中,我执行了以下操作:

@ECHO OFF
START "application.exe" %1

使用START,允许我启动应用程序并关闭命令行窗口

是。-这将打开并显示窗口,但不允许我传递导致我。。。创建一个定义了参数的快捷方式,我可以使用nsiLocalFile调用该快捷方式。。。然后批处理文件就会运行。但我希望参数是动态的。有没有办法在运行中创建快捷方式?FWIW,你的第一个代码片段在Vista和Firefox 3.6上对我来说很好。这是一个Windowsquestion@0A0D确保更改后将执行通过
进程运行的代码。