2008-11-22 7 views
4

J'appelle un fichier de commandes de Javascript de cette façon:fichier batch appelé de Javascript/XPCOM ne montre pas fenêtre d'invite

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

mon fichier batch de test est:

echo on 
echo %1 
pause 
exit 

Chaque Lorsque j'appelle un fichier de commandes, l'invite de commande ne s'affiche pas, comme si j'exécutais simplement le fichier de commandes à partir du bureau. Comment puis-je y remédier et afficher une invite de commande pour le fichier batch?

Modifier Pour être clair, le processus cmd.exe est lancé - je peux le voir dans la barre des tâches. Mais aucune fenêtre ne s'affiche. Cet extrait se comporte de la même manière:

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, votre premier extrait fonctionne très bien sur Vista et Firefox 3.6. – Nickolay

+0

Et sur XP avec 3.6 aussi ... – Nickolay

Répondre

1

Avez-vous essayé d'utiliser la méthode de lancement de nsiLocalFile?

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

Cela devrait avoir "the same effect as if you double-clicked the file."

+0

Oui. - ceci ouvrira et montrera la fenêtre mais ne me laissera pas passer des paramètres/arguments (que j'ai omis de mentionner dans ma question) – pc1oad1etter

+0

Ce qui m'a conduit à ... créer un raccourci qui a les paramètres définis, et je peux appeler le raccourci en utilisant nsiLocalFile ... et les fichiers batch sont exécutés. Mais je veux que les paramètres soient dynamiques. – pc1oad1etter

+0

Existe-t-il un moyen de créer un raccourci à la volée? –

2

La seule solution que je l'ai entendu à ce jour (qui devrait fonctionner, même si je ne l'ai pas encore fait, vient de Mook dans le canal IRC XULRunner de Mozilla:

créer un fichier de commandes temporaire, écriture dans le fichier batch pour appeler et arguments pour le transmettre ensuite exécuter le fichier batch temporaire

par exemple psuedocode:...

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

pas très élégant, mais il devrait fonctionner

-1

Pfft, code très moche .. Une astuce beaucoup plus agréable consiste à utiliser Win.com pour générer un sous-système 16 bits de l'invite de commande. Win.com enverra la console au terminal virtuel droit, vous montrant la sortie.

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

Nicer, et fonctionne :)

0

Cet extrait de code semble fonctionner très bien. Bien sûr, vous devez changer D: \ Windows \ system32 \ en chemin vers cmd.exe dans votre système d'exploitation.

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

Pourquoi bloquer est-il vrai? –

+0

@ 0A0D pour vous assurer que le code passé 'process.run' sera exécuté * après * les modifications ont été effectuées. – izogfif

0

Vous faites bien, mais réparer ce:

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

Si vous faites cela ???

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

Un @Echo rebutés à initialisation ???

Merci

-1

Pour 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

Ceci est une question de Windows –

0

je devais lancer un fichier de commandes et passer un argument.Voici comment je l'ai fait:

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 
    } 

et dans mon fichier batch de fenêtre, je l'ai fait:

@ECHO OFF 
START "application.exe" %1 

avec START, m'a permis de lancer l'application et fermer la fenêtre de ligne de commande

+0

si vous faites 'START/B ...' il ne montrera pas la fenêtre de commande –

Questions connexes