2008-11-22 48 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 

,讓我啓動應用程序,並關閉命令行窗口