Firefox, lokale Batch ausführen, cmd im 3er versteckt - Revisit
![](/uploads/users/avatars/000/000/018/thumb/waechter.png)
- browser
Hi,
ich beziehe mich hier auf diesen alten Thread.
Mein Firefox 3 hat inzwischen ein paar Updates erhalten, ist jetzt bei 3.0.5 - aber leider war kein Fix für mein Problem dabei ...
Eine Teil-Lösung habe ich mittlerweile gefunden:
statt ~~~javascript
function update(param)
{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("c:\pfad\zur\batch.bat");
var process = Components.classes["@mozilla.org/process/util;1"].createInstance(Components.interfaces.nsIProcess);
process.init(file);
process.run(true, [param, "bla"], 2);
}
könnte ~~~javascript
function update(param)
{
netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
file.initWithPath("c:\\pfad\\zur\\batch.bat");
file.launch();
}
verwendet werden - das führt dazu, daß das Batchfile (nach entsprechender Sicherheits-Nachfrage) ausgeführt wird. Das Fenster wird auch angezeigt.
Einen gewaltigen Haken hat die Sache aber noch:
Im Gegensatz zu process.run() ist es bei file.launch() nicht möglich, Parameter zu übergeben - weder laut Doku noch laut meinen Versuchen mit (analog zu run())
file.launch(true, [param, "bla"], 2);
bzw. mit direkter Parameterliste
file.launch(param, "bla");
In beiden Fällen wurde der Batch gestartet, aber ohne die Parameter.
Diese sind in meinem Fall aber zwingend erforderlich.
Sollte jemand eine Möglichkeit kennen, die das cmd-Window anzeigt UND Parameter für das Batch-File erlaubt, bitte ich um sachdienliche Hinweise, wie ich das auch hinbekommen kann.
Es reicht auch vollkommen, wenn das unter Windows klappt - mehr brauch ich (für diesen Fall) nicht.
cu,
Andreas
Hi,
bitte bleibe in deinem alten Thread.
Hi,
bitte bleibe in deinem alten Thread.
Nein, in diesem Fall bleibe ich im neuen.
Der erste enthält den geplanten Text nicht - da ist durch mehrfaches Hin- und Herschalten zwischen mehreren Rechnern (RemoteDesktop) und Programmen versehentlich der Submit von mir unbemerkt ausgelöst worden.
cu,
Andreas
Hi,
das war ein sogenannter Scherz
Hi,
das war ein sogenannter Scherz
Aha, ich dachte schon Persönlichkeitsspaltung
Was willst du mir damit sagen?
@@Manfred:
das war ein sogenannter Scherz
Aha, ich dachte schon Persönlichkeitsspaltung
Was willst du mir damit sagen?
Die richtige Frage wäre gewesen: Was willst du uns damit sagen?
Live long and prosper,
Gunnar
PS: Das war ein sogenannter Scherz.
hi $name,
das war ein sogenannter Scherz
Aha, ich dachte schon Persönlichkeitsspaltung
Was willst du mir damit sagen?Die richtige Frage wäre gewesen: Was willst du uns damit sagen?
denn wir sind viele
SCNR
PS: Das war ein sogenannter Scherz.
dito
gruss
shadow
Hi Andreas,
ich bin derjenige, der dir gestern die Nachricht geschickt hat. Ich habe inzwischen eine Lösung gefunden, die es ermöglicht, das CMD-Fenster anzuzeigen und Parameter zu übergeben. Sie ist allerdings ganz schön umständlich.
1. Du schreibst den gewünschten Parameter mittels JavaScript in eine beliebige Text-Datei (gibt ja entsprechende XPCom-Write-Methoden).
2. Du führst mittels run() oder launch() eine Batch-Datei aus, die aus deiner ursprünglichen Batch-Datei und der über JavaScript erzeugten Parameter-Datei eine neue Batch-Datei bastelt (z.B. copy /b "Parameter.txt" + "Ursprungsbatch.bat" NeueBatch.bat)
3. Du führst diese neue Batch-Datei mittels launch() aus.
Viele Grüße
Hendrik
Hi,
ich bin derjenige, der dir gestern die Nachricht geschickt hat. Ich habe inzwischen eine Lösung gefunden, die es ermöglicht, das CMD-Fenster anzuzeigen und Parameter zu übergeben. Sie ist allerdings ganz schön umständlich.
- Du schreibst den gewünschten Parameter mittels JavaScript in eine beliebige Text-Datei (gibt ja entsprechende XPCom-Write-Methoden).
- Du führst mittels run() oder launch() eine Batch-Datei aus, die aus deiner ursprünglichen Batch-Datei und der über JavaScript erzeugten Parameter-Datei eine neue Batch-Datei bastelt (z.B. copy /b "Parameter.txt" + "Ursprungsbatch.bat" NeueBatch.bat)
- Du führst diese neue Batch-Datei mittels launch() aus.
Oh - auf die Idee muß man erstmal kommen ...
Werd ich bei Gelegenheit mal testen.
cu,
Andreas
Hi,
- Du schreibst den gewünschten Parameter mittels JavaScript in eine beliebige Text-Datei (gibt ja entsprechende XPCom-Write-Methoden).
- Du führst mittels run() oder launch() eine Batch-Datei aus, die aus deiner ursprünglichen Batch-Datei und der über JavaScript erzeugten Parameter-Datei eine neue Batch-Datei bastelt (z.B. copy /b "Parameter.txt" + "Ursprungsbatch.bat" NeueBatch.bat)
In meinem Fall besteht die Batch-Datei nur aus ein paar Zeilen - da könnte ich die gleich direkt komplett mit Parametern überschreiben und dann direkt per Launch ausführen. Auf das Umkopieren könnte ich also verzichten.
Muß ich mir aber wie gesagt noch genauer angucken, nach Feierabend.
cu,
Andreas
Moin Moin!
Aus reiner Neugier: Warum machst Du sowas? (Und was genau wird das?)
Alexander
Hi,
Aus reiner Neugier: Warum machst Du sowas? (Und was genau wird das?)
Sag ich Dir nur, wenn ich ne gute Lösung von Dir kriege ;-)
Ne, ist ein kleines Tool für uns hier (in der IT).
Aus den lokalen Dateien und aus dem Stand im Versionscontrolsystem wird eine HTML-Übersichtsseite generiert, in der die Unterschiede angezeigt werden.
Je nach Status (nur lokal geändert, im Control-System geändert, in beiden geändert) gibt's dann die Möglichkeit, per Link den passenden Batch aufzurufen, um entweder den Ordner mit der Datei anzuzeigen (file.reveal()) oder die Datei oder ggf. auch übergeordnete Ordner aus dem Controlsystem upzudaten (Hierzu brauche ich den Batch) usw.
Ursprünglich war's nur ne Übersichtsseite, dann hatte ich hier mal gelesen, daß es möglich ist, eine Batch-Datei aufzurufen, da hab ich das dann eingebaut - hat im Firefox auch gut geklappt, das CMD-Window war sichtbar.
Mit Firefox 3 funktioniert's im Prinzip immer noch, aber das CMD-Window ist nicht sichtbar.
In der Übersichtsseite sind auch noch zig andere Daten dabei, das Script mit einer anderen Oberfläche als HTML zu erzeugen wäre ziemlicher Aufwand ...
cu,
Andreas
Moin Moin!
Ich hätte das vermutlich über einen lokal laufenden Webserver gebaut, der bei Bedarf auf irgendeinem Port über 10.000 auf Requests wartet. Entweder permanent oder als Kommando, das dann auch gleich den Webbrowser startet. Ist ja nicht sonderlich schwer, wenn man Perl oder ähnliches zur Verfügung hat.
Ich bin aber mittlerweile so ein Kommandozeilen-Fan geworden, dass ich meine Projekte fast komplett über Makefiles steuere, ggf. mit eingestreutem Perl. Das führt natürlich auch dazu, dass ich an der kruden Syntax und den fehlenden Fähigkeiten der DOS- und Windows-Shells (command.com bzw. cmd.exe) regelmäßig verzweifle.
Wenn Du so an Deinem DOS-Fenster hängst:
Baue (noch ein) Hilfs-Batch, dass das Haupt-Batch aufruft, und zwar über das Build-In-Kommando start:
@echo off
rem *** called by firefox ***
start main.cmd %*
rem *** hardcoded parameters: ***
start main.cmd /foo bar.txt baz.html
Wenn Du auf das Ende des Scripts warten willst:
start /wait main.cmd %*
Du kannst auch noch andere Sachen steuern, z.B. den Fenstertitel.
start "Hohoho - don't forget the quotes" /wait main.cmd %*
Alexander
Hi,
Wenn Du so an Deinem DOS-Fenster hängst:
Baue (noch ein) Hilfs-Batch, dass das Haupt-Batch aufruft, und zwar über das Build-In-Kommando start:
Waaaaaah!
Wieso bin ich auf diese simple Idee nicht gekommen?
Danke für's Bäume-Abräumen, das hilft beim Wald-sehen ;-)
Ich mußte noch im inneren batch ein "exit" ergänzen - ohne ist das Fenster stehengeblieben, aber ansonsten paßt's.
Bleibt nur die (akademische) Frage , warum seit Firefox 3 das Cmd-Window für das ursprüngliche Batch-File versteckt wird ...
cu,
Andreas
Grundlage für Zitat #1344.
Moin Moin!
Danke für's Bäume-Abräumen, das hilft beim Wald-sehen ;-)
Immer wieder gerne.
Bleibt nur die (akademische) Frage , warum seit Firefox 3 das Cmd-Window für das ursprüngliche Batch-File versteckt wird ...
Weil sich die meisten Benutzer (vornehmlich die ganz ahnungslosen Mausschubser) an den "häßlichen schwarzen Fenstern" [1] stören. Typischerweise braucht man die DOS-Boxen ja ohnehin nur noch, um irgendein buntes Tool zu starten oder irgendwelche Hintergrundsachen zu erledigen, die ohnehin keiner sehen will.
Wenn Du mindestens Win2K garantieren kannst, müßtest Du das versteckte Fenster auch wieder hervorzaubern können:
Es gibt eine Funktion GetConsoleWindowHandle() (eben erst ab Win2K), die liefert das HWND der Konsole, in der das (Konsolen-)Programm aufgerufen wurde. Ein ShowWindow(hWnd,SW_SHOWNORMAL) müßte die Konsole sichtbar machen. Für ältere Windows-Versionen muß man sich ein wenig mehr anstrengen:
#include <windows.h>
HWND KnownWindowHandle=0;
HWND WINAPI GetConsoleWindow()
{
if (0==KnownWindowHandle) {
/* Based on Knowledge Base Q124103 */
#define MY_BUFSIZE 1024
char newWindowTitle[MY_BUFSIZE]="";
char oldWindowTitle[MY_BUFSIZE]="";
char currDir[MY_BUFSIZE]="";
if (0==GetConsoleTitle(oldWindowTitle,MY_BUFSIZE)) { return 0; }
GetCurrentDirectory(MY_BUFSIZE,currDir);
wsprintf(newWindowTitle,"::%d::%d::%s::",GetTickCount(),GetCurrentProcessId(),currDir);
if (0==SetConsoleTitle(newWindowTitle)) { return 0; }
Sleep(40); // Ensure window title has been updated.
KnownWindowHandle=FindWindow(NULL,newWindowTitle);
SetConsoleTitle(oldWindowTitle);
}
return KnownWindowHandle;
}
(Stammt aus den Tiefen meines RAID-Arrays, keine Garantie!)
[1] O-Ton eines Mausschubser-Kunden in einem "S.M." abgekürzten Projekt, an dem ich zum Glück nicht wesentlich beteiligt war. "M." bedeutete Messung, Kenner des Projektcodes deuteten den Projektnamen allerdings als SM im Domina-Sinn.
Sinngemäß aus dem Kopf zitiert (Turbo C under DOS im Windows-Fenster):
void main(void)
{
/* ... */
spawn("C:\\command.com /c mkdir c:\temp");
spawn("C:\\command.com /c mkdir c:\temp\foo");
spawn("C:\\sm\\bin\\step2.exe foo bar baz");
/* .... */
}
Irgendwann hab ich dem Autoren dieser Zeilen dann mal gezeigt, wie man an die Online-Hilfe kommt, und dass es in C durchaus eine mkdir-Funktion gibt -- der Code hat einfach zu sehr in den Augen gebrannt.
Alexander