从Javascript/XPCOM调用的批处理文件不';t显示命令提示窗口
我以这种方式从Javascript调用批处理文件:从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
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确保更改后将执行通过
进程运行的代码。