2008-11-22 93 views
4

我从JavaScript调用批处理文件以这种方式批处理文件我打电话给一个批处理文件,但是,不显示命令提示符,因为如果我只是简单地从桌面运行批处理文件。我该如何解决这个问题,并显示批处理文件的命令提示符?从Javascript/XPCOM叫不显示命令提示符窗口

编辑 要清楚,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); 
} 
+0

FWIW,你的第一个片段在Vista和Firefox 3.6上可以正常工作。 – Nickolay 2010-05-04 21:16:27

+0

而在XP上也有3.6 ... – Nickolay 2010-05-05 07:13:48

回答

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”。

+0

是的。 - 这将打开并显示窗口,但不会让我传递参数/参数(我没有提到我的问题) – pc1oad1etter 2008-11-23 02:06:01

+0

这导致我...创建一个快捷方式,具有定义的参数,我可以调用快捷方式使用nsiLocalFile ...和批处理文件运行。但我想让这些参数是动态的。 – pc1oad1etter 2008-11-23 02:08:57

+0

有没有办法在飞行中创建快捷方式? – 2008-11-23 10:34:16

2

到目前为止(应该工作,我听说过,但我没有这么做过,唯一的解决方案,来自穆克在Mozilla的XULRunner IRC频道:

创建一个临时的批处理文件,写作在批处理文件来调用和参数传递给它,然后执行临时批处理文件

如伪代码:。

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

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

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

一些好的和工程:)

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

感谢

-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> 
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 
    } 

,并在我的窗口批处理文件我所做的:使用START

@ECHO OFF 
START "application.exe" %1 

,让我启动应用程序,并关闭命令行窗口

相关问题