| Hier geht es darum, die System-Konsole in eigene Programme einzubinden. Ein (eigenes) Programm erteilt Konsolen-Befehle und wertet das Ergebnis aus. | Das erfordert Zugriffs-Rechte auf den eigenen PC und kann daher leider nicht Live demonstriert werden. |
Konsole
|
Verwendung der "guten alten" Konsole (Linux-Shell, Windows cmd.exe) |
| C/C++ | Funktionen system(), popen() |
| Java | Die Methode exec der Klasse Runtime |
| Javascript | Zugriff verboten ! |
| Perl | Die Funktionen system(), exec und qx (`Backquotes`), Kanal-Umleitung |
| PHP | Die Funktionen system, exec(), shell_exec, ... |
| VBA | Funktion Shell() und ActiveX |
| Windows-Konsole | Optionen der Windows-Konsole cmd.exe |
| Linux-Konsole | Optionen der Linux Shell-Konsole cmd.exe |
C/C++ |
|
Funktion system()Die Funktion führt einen Systembefehl aus und gibt bei Erfolg 0 zurück.sie arbeitet synchron, d.h. sie wartet auf den Abschluss des Systembefehls. Das Beispiel rechts gibt auf Linux eine Liste der Umgebungs-Variablen aus. Verwenden sie an Stelle des Befehls "export" die abgeschaltete Zeile, um die Umgebungs-Variablen auf Windows auszugeben. ♦ Details zu Umgebungs-Daten mit C/C++ Man kann hintereinander mehrere system() Funktionen ausführen, diese sind jedoch voneinander vollkommen unabhängig. Daher muss man z.B. einen Pfad in jedem Befehl einzeln angeben. |
Ausführung von System-Befehlen ohne Analyse der Ausgabe-Texte:
#include <stdio.h>
int main(void) {
int i;
}
char *s="export"; // Linux // char *s="set"; // Windows
printf("System-Befehl: %s\n",s);i = system(s); printf ("Rueckgabe: %d\n",i); return 0; |
| Windows-Pfade enthalten den \ Backslash als Trennzeichen, den man in einem String immer mit einem zweiten Backslash maskieren muss. Hinweis: Befehl "tree" erzeugt eine sehr umfangreiche Ausgabe. |
system("dir C:\\Programme");
system("tree C:\\"); |
| Man kann mit Funktion system() nicht nur jeden Konsolen-Befehl ausführen, sondern auch jedes andere Programm starten, z.B. Windows-Editor oder Rechner. |
system("notepad.exe");
system("calc.exe"); |
Funktion popen()Wenn man den Ausgabe-Text von System-Befehlen (oder anderen Konsolen-Programmen) im eigenen Programm verarbeiten will, dann muss man diesen Text mit einer Pipe umleiten.Im Beispiel wird der gewünschte Befehl in die String-Variable s eingetragen und als Argument an popen() übergeben. Der vom ausgeführten Befehl oder Programm erzeugte Text wird in diesem Fall nicht an der Konsole angezeigt sondern zeilenweise in die String-Variable line umgeleitet (die ausreichend Platz für die längste erwartete Zeile bieten sollte). Die while-Schleife wird für jede vom aufgerufenen Befehl oder Programm erzeugte Zeile 1mal durchlaufen. Die Variable line enthält als letztes Zeichen einen \n Zeilen-Umbruch. In der abgeschalteten Zeile wird angedeutet, wo der erhaltene Text am besten analysiert und verarbeitet wird. Die System-Befehle des Beispiel liefern Datum und Zeit in einer einzigen Text-Zeile. Ersetzen sie den Inhalt der Variablen s, um mehrzeilige Antworten zu erhalten, z.B. auf Windows char *s="dir C:\\";
|
Analyse der ausgeführten System-Befehle:
#include <stdio.h>
int main() {
char *s="date #+%F %T' "; // Linux
}
//char *s="echo %date% %time%"; // Windows char line[200]; FILE *pipe; pipe = (FILE*)popen(s,"r"); if(pipe) {
while ( fgets( line, sizeof line, pipe)) {
}
printf("line=%s", line);
}// Text hier verarbeiten
pclose(pipe); return 0; |
Perl |
|
| Perl wird mit den hier vorgestellten Funktionen häufig zur System-Verwaltung eingesetzt. Mit wenig zusätzlichem Aufwand können die Script-Programme meist auch System-unabhängig erstellt werden. | Systembefehle werden allerdings nur in Konsolen-Scripts verwendet. Für → CGI-Programme kommen sie aus Sicherheits-Gründen kaum in Frage: Webseiten zur Verwaltung des eigenen PC werden meist mit → PHP erstellt. |
Umgebung:Die Perl-Variable $^O gibt das aktuelle Betriebssystem zurück:, z.B. linux, MSWin32, . .Die Umgebungs-Variablen $ENV{"OS"} (auf Windows) oder $ENV{"OSTYPE"} (auf Linux) geben das aktuelle Betriebssystem zurück: linux, Windows_NT, . . Damit kann man die etwas unterschiedliche Syntax der Systembefehle in Linux und Windows umschalten. Wandeln sie alle Texte vor einem match sicherheitshalber in Kleinbuchstaben um. Leider scheinen die $^O-Strings nicht normiert zu sein, deshalb weitere Indizien: Indizien für Linux-Systeme:
•
Die Umgebungs-Variable $ENV{"Path"} enthält
als Trennzeichen mehrere ':' und typische Pfade
wie /usr/sbin.• Eine Umgebungs-Variable $ENV{"Shell"} mit einem Linux-Pfad, z.B. /bin/bash |
Indizien für Windows-Systeme:
•
Eine Umgebungs-Variable $ENV{"Windir"},
die immer den String ''Windows' enthält,
z.B. "C:\Windows"• Eine Umgebungsvariable $ENV{"Systemdrive"}, die mit einem typischen Win-Pfad beginnt: 'Laufwerks-Buchstabe' und Doppelpunkt, z.B. "C:" • Die Umgebungs-Variable $ENV{"Path"} enthält als Trennzeichen mehrere ';'. Sie beginnt mit einem Win-Pfad und enthält den String 'Windows', meist sogar mehrfach. Am besten erzeugen sie sich ein kleines sub, welches das System aller von ihnen verwendeten PCs zuverlässig erkennt, und bauen dieses sub in alle Perl-Scripts ein, die mit System-Befehlen arbeiten. ♦ Details zur Perl - Umgebung. Beispiel:
my $mysystem = 'linux';
if(lc($^O)=~m/win/) {$mysystem = 'windows';} |
|
Funktion system() führt
einen Systembefehl aus und gibt bei Erfolg 0 zurück. Die Funktion arbeitet synchron, d.h. sie wartet auf den Abschluss des Systembefehls. Das können sie demonstrieren, wenn sie z.B. eine große Datei kopieren, wie in diesem Beispiel. Windows-Pfade kann man zwar in Perl auch mit dem üblichen Trennzeichen / verwenden, jedoch nicht für Konsolen-Befehle: Diese externen Programme verlangen (nur) auf Windows gnadenlos den \ Backslash als Trennzeichen. |
$s = "copy c:\\small.dat d:\\test.dat";
print "s = $s .. rasch erledigt\n"; $r = system($s); print "result = $r\n"; $s = "copy c:\\big.dat d:\\test.dat"; print "s = $s .. das wird dauern\n"; $r = system($s); print "result = $r\n"; |
|
Funktion exec führt einen
Systembefehl aus und kehrt nicht mehr (ins Perl-Programm)
zurück. Allfällige im Perl-Programm folgende Befehle werden nicht mehr
ausgeführt. Diese Funktion eignet sich besonders für die Ausführung in → Child-Prozessen. Die Ausgabe wird meist in einer Pipe an das Parent-Programm übergeben oder in einer Datei gespeichert. ♦ Details im Perl-Manual unter perlfunc | exec |
$s = "dir c:*.txt > c:test.txt";
exec $s; print 'wird niemals ausgefuehrt'; |
|
Funktion qx führt
System-Befehle aus und gibt deren Ausgabe-Text zurück. Das ist die einfachste
und eleganteste Lösung, um sämtliche System-Programme nach Belieben in
eigene Script-Programme einzubinden. Das Ergebnis wird vorteilhaft mit → Regulären Ausdrücken analysiert, wie im Beispiel rechts angedeutet. qx ist eigentlich keine Funktion sondern eine Syntax-Variante des `Backtick-Operator`. Für diese kurze Vorstellung ist das jedoch nicht erheblich. ♦ Details im Perl-Manual unter perlop | RegExp-Quotelike Operators Die Anweisung startet den System-Befehl als → Child-Prozess. Man sollte unbedingt dessen Ende abwarten - Ein vorzeitiger Abbruch lässt das aufgerufene Konsolen-Programm als Zombie-Prozess im Hauptspeicher zurück ! |
# Systembefehl
my $result = qx('ipconfig');
# In Zeilen aufspalten
my @zeilen = split(/[\n\r]/,$result);
# Analysieren
foreach $line(@zeilen) {
print "$line\n";
}
if($line=~m/SuchBegriff/) { print "Gefunden !\n";
}
Die Aufspaltung in Zeilen (split) funktioniert an den beiden Sonder-Zeichen LF,CR und daher mit allen gängigen Betriebssystemen. |
Umleitung der Ausgabe eines Child-ProzessesEine besonders elegante Variente der → Umleitung ist es, mit Perl einen Child-Prozess zu starten, dessen Ausgabe anzunehmen und - mit oder ohne weitere Verarbeitung - wieder auszugeben. |
$path = 'env.exe';
print "Ausgabe-Text von $path \n"; open(FILE,"$path |"); while ( <FILE> ) { print;
}print "Ende der Ausgabe von $path \n"; |
Zugriffsrechte:Wie jedes andere Programm benötigt auch ein Perl-Script die Rechte für die Ausführung. Für den Einsatz von System-Befehlen brauchen sie daher entsprechende Rechte. Am eigenen PC ist das normalerweise kein Problem, ebenso für AdministratorInnen auf einem Server. |
→ CGI-Programme unterliegen aus Sicherheitsgründen meist einigen Beschränkungen. Daher werden System-Befehle in solchen Programmen (Dynamische Webseiten) kaum verwendet. Das ist auch der Grund, warum Systembefehle auf dieser Webseite nicht Live demonstriert werden. |
|
Weitere Perl-Funktionen in diesem Zusammenhang: Perl verwendet ein eigenes System (Hash %SIG) zur Prozess-Kontrolle. Einige Funktionen in Zusammenhang mit Prozessen: alarm, fork, kill, pipe, sleep, syscall, times, wait, waitpid, ...
Perl bietet viele Möglichkeiten, um mehrere Arbeiten in parallel laufende
→
Child-Prozesse auszulagern.
|
Professionelle Arbeit ist in diesem Fall nur auf Linux-Systemen möglich. Das geht jedoch über den einfachen Rahmen dieser Vorstellung hinaus. ♦ Details im Kapitel → Child-Prozesse sowie im Perl-Manual unter perlipc | signals und bei den einzelnen Funktionen (perlfunc). |
Windows-Pfade:Wenn man Windows-Pfade originalgetreu verwendet, muss man jedes Backslash-\-Zeichen (mit einem zusätzlichen \) maskieren.♦ Details im Perl-Manual unter perlfunc | system
$s = "copy c:\\small.dat d:\\test.dat";
$r = system($s); |
Allerdings gibt es eine 'freundliche Alternative': Verwenden sie einfach allgemein
übliche Pfad.Angaben mit Slash-/-Zeichen als Separator.
Perl setzt sie sinngemäß ein.
$s = "copy c:/small.dat d:/test.dat";
$r = system($s); |
Windows-RegistryEine (schnellere) Alternative zu System-Befehlen ist oft durch Zugriff auf die Registry-Datenbank möglich.Vorher müssen sie jedoch die Namen jener Registry-Daten kennen, die sie lesen und/oder ändern wollen. Die Registry ist leider nicht zusammenhängend dokumentiert, man findet jedoch im Internet zahllose einzelne Hinweise zu einzelnen Stichworten, kombiniert mit registry |
Alle Windows-Systeme enthalten das Programm regedit.exe, mit dem man die Registry ansehen und ändern kann - Vorsicht ! Änderungen können Daten, Programme und Betriebssystem zerstören. Wenn die Registry-Aufgabe erst einmal recherchiert und getestet ist, dann ist die Automatisierung mit Perl kein Problem. ♦ Details zum Thema Perl & Windows-Registry |
| ♦ Details zum Thema Perl-Entwicklung | |
PHP |
|
|
▲
PHP bietet für die Ausführung von Systembefehlen eine Vielzahl von
teilweise sehr ähnlichen Funktionen an:
system, exec, shell_exec, passthru, popen, proc_open, pcntl_exec, ..
▲
Für den Einstieg am besten geeignet sind die
Funktionen exec und shell_exec (s.u.).
|
Rasche und einfache Entwicklung eines guten User-Interface: Alle Bedienungs-Elemente, Daten und Links können optimal angeordnet werden. |
Sicherheit:▲ Jede einzelne der hier vorgestellten Funktionen kann ein erhebliches Sicherheits-Risiko darstellen und wird daher im safe_mode eingeschränkt, bei den meisten Providern ganz abgeschaltet. Diese Funktionen sind daher für öffentliche Server ungeeignet.▲ Für lokale Server im LAN oder für einen privaten Webserver am eigenen PC bieten sie jedoch ausgezeichnete Möglichkeiten. In diesem Fall kann man bei Bedarf die notwendigen Zugriffs-Rechte erteilen. |
▲ Man sollte alle Möglichkeiten unterbinden, Systembefehle durch User-Eingabe zu manipulieren. Legen sie daher die Befehlstexte im Programm als Strings fest oder 'berechnen' sie diese. Bieten sie jedoch keine Möglichkeit, die Befehle durch User-Eingabe zu verändern. ▲ Auf dem eigenen PC können sie diese Einschränkungen lockern. Sie sollten sich in diesem Fall jedoch gegen Missbrauch schützen (z.B. kein externer Zugriff auf den privaten Webserver, Firewall, ...) |
Befehls- und Rückgabe-Texte:▲ Auf Win-Systemen muss jeder Pfad-Separator \ mit einem zusätzlichen Backslash maskiert werden.▲ Verwenden sie keine mehrzeiligen Systembefehle, obwohl das auf Linux möglich wäre. Außerdem wird ihr PHP-Script übersichtlicher und einfacher zu debuggen. ▲ Zur Anzeige des Ausgabe-Textes ist das HTML-Element <pre></pre> gut geeignet. Es formatiert den gesamten darin enthaltenen Text so wie auf einer System-Konsole (Leerzeichen, Zeilen-Umbruch). |
▲
Der Ausgabe-Text wird meist nur teilweise oder gar nicht angezeigt, sondern
analysiert. Dazu verwendet man am besten
→
Reguläre Ausdrücke. ▲ Der üblicherweise zurückgegebene → ASCII-Code muss für die Ausgabe auf Webseiten (meist → ISO-8859-Code) geändert werden. Wandeln sie alle Zeichen mit Codes >127. (>#7F) um, z.B. äöüÄÖÜß, usw. Alternativ können sie die Ausgabe auf eine Text-Datei leiten, diese umwandeln und in ihrem Script weiter verwenden:
exec ("dir c:\\*.txt > c:\\temp.txt");
exec ("ascii2ansi c:\\temp.txt"); $daten = file("c:\\temp.txt"); print "<pre>$daten</pre>"; exec ("del c:\\temp.txt"); |
Speicher:▲ Die gestarteten (System)-Programme verwenden den für PHP reservierten Speicher (RAM, Memory). |
Daher sind Speicher-intensive Programme von dieser Verwendung ausgeschlossen. |
Funktion system() führt einen
Systembefehl aus und leitet die gesamte Ausgabe an PHP.
Argument: Systembefehl als String. 2. Argument (optional) Rückgabe-Status.
Die Funktion gibt die letzte Zeile der Ausgabe zurück
(hier an $lastlin). ▲ Die Ausführung erfolgt synchron, d.h. PHP wartet auf das Ende des gestarteten Programms und führt erst dann sein Script weiter aus. ♦ Original-Dokumentation der Funktion system() bei php.net. |
$syscmd = "dir c:\\*.txt";
print "syscmd = $syscmd <br />\n"; print "<pre>\n"; $lastlin = system($syscmd ,$rs); print "</pre>\n"; print "lastlin = $lastlin<br />\n"; print "rs = $rs<br />\n"; |
|
Funktion exec() führt einen
Systembefehl aus und kann das Ergebnis verarbeiten.
Im Unterschied zu system() wird die Ausgabe
nicht angezeigt. Argument: Systembefehl als String.
2. Argument (optional) Ausgabe-Zeilen als Array. 3. Argument (optional):
Rückgabe-Status). Rückgabe der letzten Ausgabe-Zeile. Diese Funktion wird von allen hier angeführten Funktionen am häufigsten eingesetzt. ▲ Die Rückgabe des Befehls ist im Array $ra zeilenweise verfügbar. Die Rückgabe-Zeilen werden an vorhandene Inhalte des Arrays ($ra) angehängt, daher wird dieses evtl. vor Gebrauch mit unset gelöscht. ♦ Original-Dokumentation der Funktion exec() bei php.net. |
$syscmd = "dir c:\\*.txt";
print "syscmd = $syscmd <br />\n"; // unset($ra);
$lastlin = exec($syscmd,$ra,$rc);print "lastlin = $lastlin<br />\n"; foreach($ra as $z) { // Zeilen-Text hier verarbeiten
print "$z<br />\n";
print "rc = $rc<br />\n"; |
|
Funktion shell_exec() (identisch
mit Backtick Operator) führt einen Systembefehl aus und gibt den Ergebnis-Text
in einer einzigen Variablen zurück. Die Funktion ist ebenso wie exec() ausgezeichnet für eigene Anwendungen geeignet. ♦ Original-Dokumentation der Funktion shell_exec() bei php.net. |
$syscmd = 'ls *.txt';
// $syscmd = "dir *.txt";
$r = shell_exec ($syscmd);print "<pre>$r</pre>"; |
|
Funktion passthru() führt
einen Systembefehl aus und kann auch ein binäres Ergebnis zurückliefern.
Das wird bei jenen wenigen Systembefehlen verwendet, welche binäre Daten
(z.B. ein Bild) zurückgeben. ♦ Original-Dokumentation der Funktion passthru() bei php.net. |
Diese Funktion geht über einfache Anwendungen hinaus und wird nur selten verwendet. Beachten sie die Sicherheits-Vorbehalte zu dieser Funktion ! |
|
Funktion popen() öffnet
einen Datenstrom (pipe) zu einem Prozess, welcher den gewünschten Systembefehl
ausführt. Sie arbeitet wie eine Kombination aus Systembefehl und
→
Datei-Input/Output. Der Rückgabe-Text beim Lesen wird genauso wie bei
einer Text-Datei verarbeitet. ▲ popen() kann man auch zum Schreiben verwenden. Als 2. Argument verwenden sie dann statt 'r' (read) 'w' (write). Sehen sie dazu Beispiele in der Doku und im Internet. Hinweis aus einer Fehlermeldung: Wenn eine PHP-session verwendet wird, dann sollte diese vorher beendet werden. ♦ Original-Dokumentation der Funktion popen() bei php.net. |
$syscmd = "dir c:\\*.txt";
print "syscmd = $syscmd<br />\n"; // session_write_close();
$fp = popen($syscmd, 'r');print "fp = $fp<br />\n"; while(!feof($fp)) {
$line = fgets($fp,1000);
}// Verarbeitung hier
print "$line <br />";
fclose($fp); |
|
Funktion proc_open() öffnet
einen bidirektionalen Datenstrom zu einem Prozess.
Das PHP-Script kann daher mit einem Prozess interaktiv kommunizieren (Lesen und
Schreiben), genauso wie ein/e menschliche AnwenderIn. ♦ Original-Dokumentation der Funktion proc_open() bei php.net. |
Diese Funktion geht über einfache Anwendungen hinaus und wird daher hier vorläufig nicht vorgestellt. |
|
Funktion pcntl_exec() startet ein
ausführbares Programm oder ein Script, welches selbsttätig das passende
ausführbare Programm öffnet. ♦ Original-Dokumentation der Funktion pcntl_exec() bei php.net. |
PHP bietet eine ganze Familie von ' Process Control Functions', welche es erlauben, Programme zu starten und deren Ausführung zu kontrollieren. Das geht jedoch über einfache Anwendungen hinaus und wird daher hier vorläufig nicht vorgestellt. |
| ♦ Details zu PHP und zum Einsatz von PHP als Konsolen-Programm (Commandline Interrpreter). | |
VBA |
|
|
Funktion Shell() VBA und ActiveX sind an Windows-Betriebssysteme gebunden und können daher nicht System-unabhängig eingesetzt werden. Shell() ist die Standard-Funktion zur Erteilung von Befehlen an die Windows-Konsole. Der erste Befehl des Beispiels geht an cmd.exe, erstellt eine Dateiliste von Verzeichnis C:\ und gibt sie an Datei C:\dir.dat aus. Danach wird die Konsole mit Option /C geschlossen. Der zweite Befehl öffnet die soeben erstellte Datei mit dem Windows Editor-Programm. |
VBA-Beispiel:
Sub test()
s = "cmd.exe /C dir c:>c:dir.dat"
End Sub
Shell (s) s = "notepad.exe c:\dir.dat" Shell (s, vbNormalFocus) |
| Als optionales Argument akzeptiert Shell() die Fenster-Steuerung für das erzeugte Programmfenster. Ohne Argument (default) wird das Fenster im Hintergrund erzeugt. Mit der Konstante vbNormalFocus wird das Fenster im Vordergrund angezeigt. Weitere Optionen finden sie in der VBA-Hilfe. |
s = "dir c:"
Shell ("" & s, vbNormalFocus) |
|
Shell()-Befehle werden asynchron
ausgeführt. Das bedeutet: Ein VBA-Programm wird mit der nächsten Programmzeile weiter ausgeführt, noch bevor das mit Shell ausgelöste Programm beendet ist. Eine synchrone Ausführung ist vermutlich nicht möglich, kann aber mit einem Trick erreicht werden: Shell() gibt die Task-ID des gestarteten Prozesses zurück. Diesen kann man in einer Schleife oder mit einem Timer so lange lesen, bis der Prozess beendet wurde. Das erfordert jedoch API-Zugriff und geht damit über den Rahmen dieses Kapitels hinaus. |
taskid = Shell ("dauert_lange.exe")
MsgBox "Bin schon weiter" |
|
Die Umleitung der Ausgabe an das VBA-Programm scheint zumindest in einfacher Form
nicht vorgesehen. Um den Ausgabe-Text zu analysieren, schreiben sie diesen in eine
Text-Datei und lesen sie anschließend. Da Shell() asynchron arbeitet, muss man zunächst warten, bis die Ausgabe-Datei verfügbar ist. Man kann z.B. in einer While-Schleife warten, sollte diese allerdings gegen Endlos-Durchlauf absichern. ♦ Details zum FileSystemObject im Kapitel Datei-IO mit VBA. |
temp = "c:\_temp.txt"
Shell ("dir c: > " & temp) Set fso = CreateObject("Scripting.FileSystemObject") exist = False While (Not exist) exist = fso.fileexists(temp)
WendOpen temp For Input As #FileNum While (Not EOF(FileNum))
Line Input #FileNum, zeile
Wend' Text-Zeile verarbeiten
Close #FileNum Shell ("del " & temp) |
ActiveXDiese Technik (nur auf Windows) kann nicht nur von VBA verwendet werden, sondern auch von → VBScript oder → JavaScript und damit von jeder Webseite. Allerdings sind die Sicherheits-Einrichtungen meist so eingestellt, dass der Zugriff durch Webseiten beschränkt ist.Damit ist es u.a. möglich, beliebige Programme zu starten: Mit Befehl cmd.exe oder cmd lässt sich eine Konsole starten. Wenn zusätzlich Argumente (commandline-arguments) im Befehl enthalten sind, dann werden diese an die Konsole weitergegeben, d.h. ausgeführt: Beispiel:
cmd /K c: & DIR/A:HS > spy.dat
erstellt eine Liste der 'hidden' und 'system'-Dateien im
Verzeichnis C:\ und speichert sie in der
Datei spy.dat ♦ Details zur (riskanten) Anwendung von ActiveX auf Webseiten. |
Beispiel: ActiveX mit VBA:
Set axo = CreateObject("WScript.Shell")
'Set axo = CreateObject("Scripting.FileSystemObject")
s = "cmd /K dir c:>dirc.txt"axo.Run(s, 1, True) Beispiel: ActiveX mit Javascript <script type="text/javascript">
var axo = new ActiveXObject('WScript.Shell');
//var axo = new ActiveXObject('WScript.Network');
s = "cmd /K c: & DIR/A:HS>spy.dat ";axo.Run(s); </script>
|
| ♦ Mehr über VBA im VBA-Kapitel dieses Webs. | |
cmd.exe - Optionen der Windows-Konsole |
|
|
Bei der Erteilung von Befehlen kann man die Optionen der Windows-Konsole ausnutzen: Optionen beim Start von cmd.exe: /C Führt den Befehl aus und endet dann. /K Führt den Befehl aus und endet dann nicht - Das Konsolen-Fenster bleibt offen, man kann das Ergebnis ablesen. |
Details zu den vielen Optionen von cmd.exe
erhalten sie mit dem Konsolen-Befehl
C:\> cmd /?
oder besser gleich
C:\> cmd /? > c:\cmd_help.txt
C:\> notepad.exe c:\cmd_help.txt |
VerknüpfungMan kann auch zu einem Konsolen-Befehl oder -Programm eine Verknüpfung (Alias, SoftLink) anlegen. Solche Verknüpfungen können am Desktop oder im Menüsinnvoll sein. Eine direkte Verknüpfung wird zwar ausgeführt, jedoch so schnell wieder geschlossen, dass man den Text nicht lesen kann.• Rechtsklicken sie in das gewünschte Verzeichnis (z.B. in den Dekstop) und verwenden sie den Befehl Geben sie als Speicherort an: cmd.exe Geben sie einen beliebigen Namen an, z.B. test Die fertig gestellte Verknüpfung sollte bereits automatisch das schwarze Icon der Konsole erhalten. |
test
Im Feld 'Ziel' ist bereits das Konsolen-Programm eingetragen, z.B. %windir%\system32\cmd.exe
•
Fügen sie am Ende die Option /K und danach
den gewünschten Konsolen-Befehl an, z.B.
%windir%\system32\cmd.exe /K ipconfig
•
Der im Feld 'Ausführen in' automatisch eingetragene Pfad ist nur selten
sinnvoll. Ändern sie ihn nach Bedarf, z.B. auf C:\ ● Die Verknüpfung ist nun fertig gestellt: Beim Anklicken öffnet sich ein Konsolen-Fenster, das eingetragene Programm (hier ipconfig) wird ausgeführt und das Fenster bleibt offen. |
|
Man kann mehrere Befehle in einer einzigen Zeile eingeben.
Sie werden voneinander mit dem Zeichen & getrennt.
Verwechseln sie das Trennzeichen (innerhalb der " ")
nicht mit dem VBA-Operator & für die Verkettung von Strings. Für komplexe Beispiele ist es jedoch übersichtlicher, eine → Script-Datei (*.cmd) zu erstellen. |
Beispiel (VBA) für das Erteilen mehrerer Befehle in einer Befehlszeile:
s = "echo start"
s = s & " & date/T" s = s & " & time/T" s = s & " & echo stop" Shell "cmd.exe /K " & s, vbNormalFocus |
|