Montag, 25. Mai 2015

Computer-Tipp: Nützliches rund um die Windows Eingabeaufforderung

Die Windows Eingabeaufforderung ist ein sehr nützliches Werkzeug und kann einem viel Arbeit ersparen. Ihre Bedienung mit dem ScreenReader kann aber die eine oder andere Herausforderung mit sich bringen. Daher möchte ich hier ein paar Tipps geben, wie man sich das Leben mit der Kommandozeile ein wenig einfacher machen kann. Dabei gehe ich auf die Eingabeaufforderung als solches ein, auf die richtige Nutzung beispielhafter Komandos und auf Besonderheiten von JAWS und NVDA. Außerdem findet ihr in diesem Beitrag noch ein paar nützliche kleine Skripte und Batchdateien. Als Betriebssystem gehe ich von Windows 7 aus, in anderen Windows-Versionen sieht es aber ähnlich aus.

Hinweis: dieser Beitrag ist ein echter Tekkie-Beitrag und für Leser geschrieben, die mit Begriffen wie DOS-Kommando, Batchdatei oder Umgebungsvariable vertraut sind. Wer das noch nicht ist, aber es gerne sein möchte, der findet eine Fülle von Anleitungen im Internet. An dieser Stelle möchte ich mich aber im Wesentlichen auf die Dinge konzentrieren, die für blinde Anwender von Bedeutung sind und nicht den tausendsten Einführungskurs zum Thema Befehlszeile und Batchprogrammierung schreiben.


Das Fenster der Eingabeaufforderung


Start der eingabeaufforderung
Um die Eingabeaufforderung komfortabel starten zu können, macht eine Verknüpfung mit Tastenzuweisung Sinn, z.B. für Strg+Alt+D. Und bei der gelegenheit kann man gleich das Arbeitsverzeichnis festlegen, damit die Eingabeaufforderung nicht jedesmal im (reichlich riskanten) System32-Verzeichnis oder im Benutzerverzeichnis startet. Die oben beschriebenen Einstellungen werden übrigens spezifisch für die ausgeführte Verknüpfung gespeichert.


Der Fensterpuffer
Um möglichst optimal mit der Eingabeaufforderung arbeiten zu können, sollte man das Prinzip des Fensterpuffers verstanden haben. Dieser Puffer arbeitet wie eine Art Textdokument, in das die Fensterinhalte geschrieben werden. Der Puffer kann größer sein als das eigentliche Fenster. Standardmäßig sind sowohl Fenster als auch Fensterpuffer 80 Zeichen breit, der Puffer ist aber mit 300 Zeilen deutlich länger als das Fenster mit 25 Zeilen. Durch diese Technik ist es möglich, Ausgaben zu lesen, welche die aktuelle Fensterhöhe überschreiten, ohne diese durch "more" senden zu müssen.

Sehende Nutzer können dazu einfach den Scrollbalken verwenden. Der Fensterpuffer leistet aber auch blinden Nutzern gute Dienste. Mehr dazu findet ihr weiter unten in der Erklärung des Menüs "Bearbeiten". Eine wichtige Information gibt es aber gleich vorweg: im Gegensatz zu klassischen DOS-Systemen löscht der Befehl CLS in der Eingabeaufforderung nicht nur den sichtbaren Fensterinhalt, sondern den gesamten Fensterpuffer. Das kann sehr nützlich sein, wenn man an die Ausgaben eines bestimmten befehls herankommen und nicht durch die Ausgaben voriger Befehle abgelenkt werden möchte.


Die richtige Einstellung des Fensters
Mit der richtigen Konfiguration des Fensters kann man sich das Leben deutlich erleichtern. Die entsprechenden Einstellungen findet man im Systemmenü des Fensters im Punkt "Eigenschaften".

Der Reiter "Optionen"
Unter diesem Reiter kann man grundlegende Einstellungen zum Verhalten des Fensters vornehmen. Die Anzahl der Puffer bestimmt, wie viele Eingabeaufforderungsfenster gleichzeitig geöffnet sein können und dabei einen eigenen Kommandopuffer erhalten. Die Puffergröße bestimmt, wie viele befehle pro Puffer gespeichert werden können. Aktiviert man die Option "Alte Duplikate löschen", so werden doppelte Einträge entfernt und verstopfen bei wiederholter Ausführung nicht den Puffer. Der QuickEdit Modus erlaubt es, Text mit der Maus zu markieren und bewirkt außerdem, dass ein Klick mit der rechten Maustaste den Inhalt der Zwischenablage einfügt.

Der Reiter "Schriftart"
Nutzer mit Sehrest können hier Schriftart und Schriftgröße einstellen sowie Fettschrift einschalten. Zusammen mit den Farbeinstellungen kann man die lesbarkeit des Textes dadurch deutlich verbessern. Mein persönlicher Favorit war immer Lucida Console in fett.

Der Reiter "Layout"
Hier würde ich zunächst einmal die Höhe des Fensterpuffers drastisch vergrößern. EinWert von 2000 ist kein Problem und macht es deutlich leichter, an umfangreichere Befehlsausgaben zu kommen. Die Breite des Fensterpuffers sollte dagegen immer der tatsächlichen Fensterbreite entsprechen, da es ansonsten schwierig sein kann, den Text außerhalb des angezeigten Ausschnitts zu lesen. Auch dazu gibt es später mehr.

Es kann außerdem von Vorteil sein, das Fenster selbst zu vergrößern. Heute sind die meisten Kommandozeilenanwendungen auf variable Fenstergrößen ausgelegt. Wer aber doch mal einen Dinosaurier nutzen will, der kann die Fensterbreite einfach auf 80 belassen, das sollte eventuelle Darstellungsprobleme lösen. Die Fensterhöhe sollte man aber durchaus vergrößern, da damit der JAWS-Cursor bzw. der NVDA-Cursor mehr Texct lesen kann.

Der Reiter "Farben"
Hier kann man die Farben des Fenstertextes und des Popup-Textes einstellen. Letztere Einstellung wird verwendet, wenn man über die Funktionstasten einen Textdialog der Eingabeaufforderung aufruft. Stellt man den Fenstertext von hellgrau auf weiß, so erhöht das bereits beträchtlich den Kontrast.


Tastenkombinationen
In Sachen Tastaturbedienung hat dieses Fenster ein paar Überraschungen parat, insbesondere für Tippfaule Nutzer wie mich. Nicht alle diese Funktionen arbeiten aktuell mit allen Screenreadern (siehe unten), erwähnen möchte ich sie aber trotzdem. Die Liste gilt für die Standardeinstellung der cmd.exe.


  • Tab
    Pfad oder Dateinamen vervollständigen. Man beginnt einfach, den Namen zu schreiben und kann dann mit Tab durch die in Frage kommenden Datei- und Verzeichnisnamen blättern.
  • Cursor rauf/runter
    Blättert durch die Befehlshistorie. Damit kann man bereits eingegebene Kommandos wieder aufrufen.
  • F1 oder Cursor rechts
    Wiederholt mit jedem Drücken die Eingabe des letzten Befehls buchstabenweise.
  • F2 <Zeichen>
    Letzten eingegebenen befehl bis zu diesem Zeichen wiederholen.
  • F3
    Letzten Befehl wiederholen.
  • F4 <Zeichen>
    Von der aktuellen Cursorposition bis zum eingegebenen Buchstaben löschen. Ideal, um beispielsweise einen Dateinamen aus einem Kommando zu löschen.
  • F5
    Letzte Befehle der reihe nach durchgehen, ähnlich Cursor hoch.
  • F7
    Die Liste der letzten Befehle anzeigen. Diese Liste habe ich mit JAWS 16 noch nicht zum Laufen gebracht, aber vielleicht schaffe ich das auch noch. Mit der Eingabetaste wird der Befehl erneut ausgeführt, mit Cursor rechts oder links ins Fenster geschrieben.
  • Alt+F7
    löscht die Befehlshistorie
  • F8
    Geht die Befehlshistorie durch, zeigt aber nur befehle, die der aktuellen eingabe entsprechen.
  • F9 <Ziffer>
    Führt einen bestimmten Befehl aus der Historie anhand seiner Nummer aus (siehe F7).
  • Einf
    Umschalten zwischen Einfüge- und Überschreibmodus
  • Esc
    Aktuelle Eingabe löschen
  • Strg+Pos1
    Löscht alles links vom Cursor
  • Strg+Ende
    Löscht alles rechts vom Cursor
  • Strg Cursor rechts/links
    Wortweise springen
  • Strg+C
    Der Klassiker: den aktuell ausgeführten Befehl abbrechen, zumindest, sofern dieser auch zuhört.


Die Eingabeaufforderung als Administrator öffnen
Braucht man eine Eingabeaufforderung mit administrativen Rechten, so kann man diese auch ohne Kontextmenü starten. Dazu einfach das Startmenü öffnen, "cmd" eingeben und Shift+Strg+Enter drücken. Im Ausführen-Dialog klappt dies übrigens leider nicht.


Das erweiterte Kontextmenü
Benötigt man eine eingabeaufforderung für ein bestimmtes Verzeichnis, so kann man diese auch aus dem Explorer heraus öffnen. Dazu einfach die Markierung auf das gewünschte Verzeichnis stellen und mit Shift+Kontextmenü-Taste das erweiterte Kontextmenü aufrufen. Neben einigen anderen nützlichen Dingen findet man hier auch den Punkt "Eingabeaufforderung hier öffnen".


Das Menü "Bearbeiten"
Im Systemmenü des Eingabeaufforderungsfensters versteckt sich ein Bearbeiten-Menü mit ein paar interessanten Funktionen.

Markieren
Und hier wird es gleich richtig spannend, denn diese Funktion kann zusammen mit einem Screenreader mehr als nur Text markieren. Doch zuerst einmal zu ihrem eigentlichen zweck.

Aktiviert man die Funktion "Markieren", so kann man sich mit einem Blockcursor frei imFenster bewegen und zusammen mit der Shift-Taste Textbereiche markieren. Diese Markierung arbeitet dabei nicht wie imEditor, sondern zieht einRechteck auf, dessen Inhalt durch Drücken der Eingabetaste in die Zwischenablage kopiert wird. Esc bricht den Markierungsmodus ab. Startpunkt ist dabei immer die linke obere Ecke des Fensters. Der Markierungscursor ist aber nicht auf den sichtbaren Fensterausschnitt beschränkt, sondern kann den gesamten Fensterpuffer durchwandern. Verläßt der Cursor das Fenster, so wird dieses entsprechend mitgeführt. JAWS sagt während des Markierens leider nicht an, wo man sich befindet, während NVDA zumindest den Buchstaben unter dem Markierungscursor ansagt. Die braillezeile zeigt aber die Zeile an, in der sich der markierungscursor befindet.

In sachen Fensterpuffer wird es nun für den Screenreader spannend: ist der Markierungsmodus aktiv, so kann man einfach mit denCursortasten durch den Fensterpuffer wandern und die letzten Ausgaben lesen. Das geht besonders gut mit der Braillezeile, da sie die Ausgaben originalgetreu wiedergieben kann und damit auch Spaltenstrukturen erkennbar macht, wie sie beispielsweise der dir-Befehl ausgibt.

Alles markieren
Diese Funktion markiert den gesamten Fensterpuffer. Danach einfach die eingabetaste drücken und der Inhalt des Puffers wird in die Zwischenablage kopiert. Das ist besonders interessant, wenn man sich die Ausgaben eines Befehls inRuhe anschauen möchte. Möchte man nur die Ausgaben des nächsten befehls kopieren, so gibt man einfach vorher "cls" ein, was wie bereits erwähnt den Fensterpuffer leert. Danach den Befehl ausführen, alles markieren, in die Zwischenablage kopieren und anschließend in den persönlichen Lieblingseditor einfügen.

Einfügen
Tut, was drauf steht: fügt den Text der zwischenablage an der aktuellen Eingabeposition ein. Praktisch, wenn man mal einen Befehl von woanders her kopieren will. Aber Vorsicht: befindet sich amEnde des Befehls in der zwischenablage ein Zeilenumbruch, so wird dieser mit eingefügt und der befehl sofort ausgeführt.

Bildlauf
Wird dieser Modus aktiviert, so kann man das Fenster mit den Cursortasten scrollen. Mit demScreenreader arbeitet das meiner Erfahrung nach nicht besonders gut zusammen, ich bevorzuge daher den trick mit der Markierungsfunktion.

Suchen
Eine Suchfunktion gibt es auch. Diese funktioniert mit dem Screenreader aber eher schlecht. Alternativ kann man aber zumindest bei JAWS auch die Suchfunktion des Screenreaders verwenden.


Der Prompt
Besonders in tief verschachtelten Verzeichnissstrukturen kann es manchmal nervig sein, wenn der Screenreader ständig wieder das aktuelle Verzeichnis als teil des Eingabeprompts vorliest. Hier kann man ganz einfach Abhilfe schaffen: der Befehl "prompt" legt den Prompt für die aktuelle Sitzung fest. So reduziert man beispielsweise mit "prompt $g" den Eingabeprompt auf ein Größerzeichen. Die restliche Syntax gibt es wie immer mit "prompt /?". Und wenn man doch mal wissen will, wo man sich gerade befindet, so kann man einfach "cd" eingeben und der aktuelle pfad wird ausgegeben.

Will man den Prompt permanent verändern, so kann man dies am einfachsten durch Setzen der Umgebungsvariable %PROMPT% tun. Wie man Umgebungsvariablen dauerhaft setzt, beschreibe ich weiter unten. Diese Ämderimg wird übrigens erst mit der nächsten Anmeldung wirksam.


Die Braillezeile


Wer über eine Braillezeile verfügt, der kann mit dieser den Inhalt des Fensters sehr angenehm und übersichtlich auslesen. Eine 80er Zeile ist dabei natürlich besonders nützlich. Leider ist aber auch hier die Navigation auf das Fenster beschränkt, an den Inhalt des Fensterpuggers kommt die Zeile meines Wissens nach weder mit JAWSnoch mit NVDA heran.

Auch die richtige Konfiguration kann helfen. Kurzschrift macht in der Eingabeaufforderung wohl eher weniger Sinn, und bei JAWS hilft die Aktivierung des Flächenmodus, den Überblick über die Struktur der Befehlsausgaben zu behalten. Mit 8-Punkt-Braille kann man wiederum ein Wenig Platz sparen.


NVDA


Als NVDA-Nutzer sollte man sich vor allem mit dem NVDA-cursor auskennen, mit dem sich das Fenster der Eingabeaufforderung problemlos navigieren lässt. Wie bereits erwähnt, kann dabei ein größeres Fenster durchaus Sinn machen, da dieser auf den sichtbaren Fensterausschnitt beschränkt ist.

Für umfangreiche Ausgaben, wie sie beispielsweise bei robocopy vorkommen können, kann man zwischendurch den Schlafmodus für das entsprechende Fenster aktivieren (NVDA+Alt+s).


JAWS


Einstellungen
Damit JAWSkorrekt mit der Eingabeaufforderung arbeitet, muss man zunächst soweit erforderlich über die Schnelleinstellungenn das Bildschirmecho auf "Alle" einstellen. Dies bewirkt, dass JAWS auch die Ausgaben der Befehle vorliest.

Der Markierungsmodus hat eigene Schnelleinstellungen, und das ist auch gut so. Will man diesen nämlich für die navigation im Fensterpuffer verwenden, so sollte man hier das Bildschirmecho abschalten, da ansonsten der Buchstabe unter dem Cursor permanent wiederholt wird.


JAWS-Cursor und unsichtbarer Cursor
Zum Lesen des sichtbaren Teils des Fensters kann man wie üblich den JAWS-Cursor oder den unsichtbaren Cursor verwenden. Zieht man den JAWS-Cursor zum PC-Cursor (JAWS+NumMinus), so landet man korrekt auf der Eingabemarkierung und kann das Fenster von unten nach oben durchgehen.


Die JAWS-Suche
Führt man in einem Eingabeaufforderungsfenster eine JAWS-Suche aus (JAWS+Strg+F), so wird diese für den aktuell sichtbaren Fenstertext ausgeführt. Wird etwas gefunden, so wird der JAWS-Cursor aktiviert und auf den Suchtreffer gestellt. Weitersuchen kann man mit JAWS+F3, wobei die Zeile des Treffers direkt vorgelesen wird.


Fenster virtualisieren
Ein anderer Trick zur leichteren Navigation in den Befehlsausgaben ist die Virtualisierung des Fensters (JAWS+Alt+w). Im virtuellen Betrachter ist es nämlich auch recht einfach, durch die Befehlsausgaben zu navigieren. Leider wird dabei nur der sichtbare Bereich des Fensters virtualisiert und nicht der Fensterpuffer. Damit eignet sich die Funktion nur für kürzere Befehlsausgaben. Auch hier macht es daher Sinn, das Fenster zu vergrößern, damit mehr Text auf den Bildschirm passt.


Der Sprachverlauf
Der sprachverlauf (JAWS+Leertaste, h) gibt ebenfalls Zugriff auf die Befehlsausgaben, diesmal aber ohne Begrenzung auf die Fenstergröße und übrigens auch dann, wenn man die Sprachausgabe mittels Strg-Taste unterbrochen hat. Hier ist aber zu beachten, dass der Sprachverlauf keine exakte Repräsentation der Befehlsausgaben weitergibt, sondern das, was an die Sprachausgabe gesendet wurde. Zum Lesen der Ergebnisse ist das meistens völlig ausreichend, beim Weiterverwenden von Inhalten wäre ich aber etwas vorsichtig. JAWS-+Leertaste, Shift-h löscht den Sprachverlauf.


Anzeige der Zwischenablage
Sobald man Inhalte des Fensters in die Zwischenablage kopiert hat, kann man sie schnell und einfach mit dem Zwischenablagebetrachter (JAWS+Leertaste, c) anzeigen und durchgehen.


Vorteile der JAWS-eigenen Funktionen
Ein Vorteil der JAWS-eighenen Funktionen ist, dass man hier auch Befehle wie das Anhängen an die Zwischenablage (JAWS+Win+c) verwenden kann. Gerade bei der Eingabeaufforderung kann dies nützlich sein, z.B. um Dateinamen oder Befehlsoptionen einzusammeln. Der Zwischenablagebetrachter zeigt dabei den Stand der Zwischenablage zum Zeitpunkt des Aufrufs an. Man kann also durch den Text gehen und verschiedene Teile an die Zwischenablage anhängen, ohne das sich der angezeigte text verändert. Erst wenn man den Betrachter neu aufruft, wird das Fenster akualisiert. Schließen muss man ihn dazu nicht, man kann einfach wieder JAWS+Leertaste, c drücken und die Sicherheitsabfrage bestätigen.

Der Zwischenablagebetrachter und der Sprachverlauf bleiben als ergebnisbetrachter übrigens geöffnet, bis man sie selber schließt, während die Fenstervirtualisierung als virtueller Betrachter beimVerlust des Fensterfokus automatisch geschlossen wird.

Außerdem stehen sowohl im Zwischenablagebetrachter als auch im virtuellenBetrachter die üblichen Funktionen wie JAWS-Suche, Schnellnavigationstasten oder Drucken bereit.


Ein paar kleine Skripte
Hier ein paar einfache JAWS-Skripte, mit denen man gängige Menüfunktionen und Befehle auf Tastenkombinationen legen kann. Die Skripte sind ausgelegt auf ein deutsches Windows 7, in anderenVersionen bzw. anderen Sprachen können die Menütasten abweichen. Die Skripte sind zugegebenermaßen ein wenig "quick & dirty" programmiert und prüfen nicht, ob angeforderte Aktionen auch wirklich ausgeführt wurden. Funktionieren tun sie bei mir trotzdem. Für Leute, die es gerne etwas sauberer haben oder die probleme mit diesen Skripten haben, habe ich am Ende noch ein Beispiel, wie man etwas ordentlicher vorgehen kann. Das alles aber unter Vorbehalt, inSachen JAWS Script bin ich definitiv noch blutiger Anfänger.

Die angegebenen tastenkombinationen sind ein Vorschlag von mir. Benötigt man das Steuerzeichen, das eigentlich auf dieser tastenkombination liegt, so kann man einfach vorher JAWS+3 drücken und die Tastenkombination direkt an die Eingabeaufforderung durchreichen.

Am Anfang des Skripts wird ein include benötigt, um die Konstanten für SayFormattedMessage zu erhalten:
Include "hjconst.jsh"

Aktivierung des Auswahlmodus (Strg+S)
Script CustomActivateSelectionMode ()
SpeechOff ()
TypeKey ("alt+space")
TypeKey ("b")
TypeKey ("m")
Pause ()
SpeechOn ()
SayFormattedMessage (OT_STATUS, "Selection mode.")
EndScript

Alles markieren (Strg+A)
Script CustomSelectAll ()
SpeechOff ()
TypeKey ("alt+space")
TypeKey ("b")
TypeKey ("a")
Pause ()
SpeechOn ()
SayFormattedMessage (OT_STATUS, "Select all.")
EndScript

Einfügen aus der Zwischenablage (Strg+V)
Für das Einfügen aus der Zwischenablage habe ich zwei Scripte definiert. Im ersten wird einfach die Einfügen-Funktionen aus dem bearbeiten-Menü aufgerufen:

Script CustomPaste ()
SpeechOff ()
TypeKey ("alt+space")
TypeKey ("b")
TypeKey ("e")
Pause ()
SpeechOn ()
SayFormattedMessage (OT_STATUS, "Paste from clipboard.")
EndScript

Das zweite Script geht etwas anders vor und fügt entfernt vor dem Einfügen sämtliche Zeilenumbrüche aus dem Text. Das vermeidet versehentliche Ausführung von kopierten befehlen.

Script Paste ()
var string s = GetTextFromClipboard ()
Let s= StringReplaceSubstrings (s, "\r", "")
Let s= StringReplaceSubstrings (s, "\n", "")
TypeString (s)
SayFormattedMessage (OT_STATUS, "Paste from clipboard without line breaks.")
EndScript

Ich habe beide Skripte auf Tasten liegen, das erste auf Shift+Strg+V und das zweite auf Strg+V.

Fenster schließen (Strg+X)
Dieses Skript löscht die aktuelle Eingabe und sendet dann denBefehl "exit" an das Fenster.

Script CustomSendExitComman ()
TypeKey ("Esc")
TypeString ("exit")
TypeKey ("Enter")
EndScript

Auf die gleiche Weise lassen sich natürlich auch andere Kommandos auf Tasten legen. So liegt bei mir zum Beispiel der Befehl "dir /b" auf Strg+D.
Alles kopieren und Zwischenablagebetrachter öffnen (Strg+W)

Dieses Skript markiert den gesamten Fensterpuffer, kopiert ihn in die Zwischenablage und startet anschließend den JAWS Zwischenablagebetrachter.

Script CustomCopyAllAndShowClipboard ()
SpeechOff ()
TypeKey ("alt+space")
TypeKey ("b")
TypeKey ("a")
Pause ()
TypeKey ("Enter")
Pause ()
SpeechOn ()
SayFormattedMessage (OT_STATUS, "Copied window buffer to clipboard.")

ShowClipboardTextInResultsViewer ()
EndScript

Aktivieren des Auswahlmodus - das etwas korrektere Skript
In diesemSkript geht es etwas ordentlicher zu. Nach dem Auslösen von Menütasten wird brav auf die Anwendung gewartet und anschließend nachgeschaut, ob die Aktion erfolgreich war.

Script CustomActivateSelectionMode ()
SpeechOff () ; Verhindert die Ansage der einzelnen Menueaufrufe
TypeKey ("alt+space")
Pause ()
If MenusActive () Then
TypeKey ("b")
Pause ()
If MenusActive () Then
TypeKey ("m")
Pause ()
SpeechOn ()
SayFormattedMessage (OT_STATUS, "Selection mode")
Else
SpeechOn ()
SayFormattedMessage (OT_ERROR, "Error opening Submenu.")
EndIf
Else
SpeechOn ()
SayFormattedMessage (OT_ERROR, "Error opening system menu.")
EndIf
SpeechOn ()
EndScript


Die richtige Nutzung von DOS-Befehlen


Unnötige Ausgaben vermeiden
Viele DOS-Befehle sind deutlich gesprächiger, als es für einen Scnreenreader-Nutzer sinnvoll ist. Ein wenig Kenntnis der verfügbaren Optionen kann hier Wunder wirken. Nehmen wir beispielsweise an, man möchte einen ganzen Verzeichnisbaum nach Dateien durchsuchen, die das Wort "load" enthalten. Dazu würde man grundsätzlich den dir-Befehl mit der Option /s verwenden:

dir *load* /s

Die Ausgabe dieses befehls würde allerdings Unmengen an Ballast enthalten, da für jedes Verzeichnis, dass mindestens einen Treffer enthält, der komplette Kopf- und Fußbereich des DIR-Befehls ausgegeben wird. Fügt man dagegen noch /b hinzu, dann erscheint eine kompakte Trefferliste mit Pfad- und Dateinamen und nichts anderem.

Einige Befehle können auch eigene Logdateien anlegen, in denen die Ergebnisse einfacher zu sichten sind als auf der Konsole. Allen voran wäre hier robocopy zu erwähnen. Neben den Logeinstellungen sollte man hier aber auch den Parameter "/np" nicht vergessen. Der unterdrückt die prozentuale Fortschrifttsanzeige beim Kopieren, welche in der Logdatei üblicherweise ziemliches Chaos auslöst.


Umleiten von Ein- und Ausgaben
Manchmal kann es sinnvoll sein,die Ausgaben eines befehls direkt in eine Datei umzuleiten, um sie dort einfacher anzeigen bzw. um sie weiterverarbeiten zu können. Das geht ganz einfach:

dir >temp.txt
Leitet die Ausgaben von dir in die Datei temp.txt um. Existiert die Datei bereits, so wird sie ersetzt.

dir >>temp.txt
Hängt die Ausgaben von dir an die Datei temp.txt an. Existiert diese noch nicht, so wird sie angelegt.

Mit dieser Schreibweise werden allerdings nur die regulären Ausgaben des Befehls umgeleitet, technisch der Ausgabekanal stdout. Tritt ein Fehler auf, so wird die entpsrechende Fehlermeldung aber in den Kanal stderr geschrieben, und der landet dann wieder auf dem bildschirm. Will man beide Kanäle in eine Datei umleiten, so kann man dies über deren Nummer tun. stdout hat die Kanalnummer 1, stderr die Kanalnummer 2. Man könnte jetzt beispielsweise die Ausgaben von stdout in eine Datei umleiten, die Ausgaben von stderr in eine andere:

dir 1>temp.txt 2>errors.txt
oder etwas einfacher:
dir >temp.txt 2>errors.txt

Will man beides in eine Datei haben., so leitet man einfach den einen Kanal in die Datei um und anschließend den zweiten Kanal in den ersten:

dir 1>temp.txt 2>&1
oder verkürzt:
dir >temp.txt 2>&1

Das Trennen von regulären Meldungen und Fehlermeldungen kann in einigen Fällen sehr sinnvoll sein, beispielsweise um einen schnellen Überblick über alle Fehler zu erhalten, die während eines komplexen Kopiervorgangs aufgetreten sind. Voraussetzung ist aber natürlich, dass die entsprechenden Fehlermeldungen auch aussagekräftig genug sind. "Datei konnte nicht kopiert werden" ist schließlich ohne den dazugehörigen Dateinamen nicht sonderlich aufschlussreich.

Will man einen Kanal erst garnicht sehen, so schickt man diesen einfach an nul:
dir >temp.txt 2>nul

Umgekehrt kann man auch eine Datei als Eingabe für einen Befehl benutzen. In diesemFall gibt es keine Kanalunterscheidungen, es geht alles in den Kanal stdin. Der folgende Befehl führt eine DNS-Abfrage für alle Domänen aus, die in liste.txt aufgeführt sind:
nslookup <liste.txt

Will man beispielsweise nur die Fehlermeldungen sehen, so verwendet man folgende Schreibweise:
nslookup <liste.txt >NUL

Der folgende befehl führt die Abfrage durch und schreibt alle Fehlermeldungen die die Datei errors.txt
nslookup <liste.txt 2>errors.txt


pipe
Mit dem Pipe-Zeichen "|" kann man die Ausgaben eines Befehls als Eingaben eines anderenbefehls verwenden, sofern letzerer dies unterstützt. Oder streng technisch: stdout wird an stdin weitergeleitet. Mit dieser Technik kann man sich viel Arbeit ersparen.

Wenn du beispielsweise deine aktuelle IP-Adresse erfahren möchtest, dann kannst du das natürlich mit ipconfig abfragen. Da kommen aber jede Menge Informationen, die du momentan garnicht wissen willst. Mit der folgenden befehlskette fragst du nur die IPv4-Adressen ab, die momentan zugewiesen sind:

ipconfig|find "v4"

Ausgegeben werden hier nur die Zeilen, die den Begriff "v4" enthalten. Bist du dir in Sachen Groß-/Kleinschreibung nicht sicher, so kann der FIND-Befehl diese auch einfach ignorieren:

ipconfig|find /i "v4"

Und diese Befehlskette zeigt alle IP-IPv4-Adressen an, die kein"192" enthalten:
ipconfig|find "v4"|find /v "192"

Man kann auch mehrere Befehle zusammenhängen. Möchtest du beispielsweise eine sortierte Liste aller IPv4-Adresen erhalten, so kannst du dazu folgenden Befehl verwenden:

ipconfig|find "v4"|sort

Ein Klassiker inSachen Pipe ist das Kommando "more". Dieser Befehl dient grundsätzlich zum seitenweisen anzeigen von Dateien, wobei eine Reihe von Steuerungskommandos verfügbar sind.
more liste.txt

Leitet man die Ausgabe eines Befehls durch more, so wird das Ergebnis seitenweise ausgegeben.
dir /s /b |more

Um die nächste Seite anzuzeigen drückt man die Leertaste, mit der Eingabetaste geht es zeilenweise weiter. Das Gleichheitszeichen gibt die aktuelle zeilennummer aus, also die Nummer der letzten angezeigten Zeile.

NVDA liest bei zeilenweisen weitergehen stets die neue Zeile vor, mit der aktuellen JAWS-Version funktioniert das leider nicht. Man kann allerdings auf den JAWS-Cursor umschalten und diesen auf die vorletzte zeile im Fenster stellen. Damit wird die neue Zeile dann zumindest auf der Braillezeile angezeigt.

Will man eine Datei ganz ohne Unterbrechung anzeigen, so kann man dafür den Befehl "type" verwenden:
type liste.txt
oder für mehrere Dateien:
type liste1.txt liste2.txt

Auf diese Weise kann man auch mehrere Dateien in einem Schwung in einen anderen befehl pipen.

Auch die Zwischenablage kann man übrigens erreichen. Der befehl "clip" schickt am ihn übergebene Daten direkt an die zwischenablage:
ipconfig|clip

Mit Hilfe der weiter oben beschriebenen Eingabeumleitung kann man mit diesembefehl übrigens auch den Inhalt vonDateien in die Zwischenablage kopieren:
clip <temp.txt

Und sollen es mehrere Dateien werden, so kann man wiederum das "type"-Kommando verwenden:
type liste1.txt liste2.txt |clip


Ausgaben in Umgebungsvariablen speichern
Will man die Ausgabe eines Befehls (stdout) in einer Umgebungsvariable speichern, so wird es ein wenig tricky, da der Befehl "set /p" wider Erwarten keine Eingaben per Pipe akzeptiert. Stattdessen kann manden FOR-Befehl kreativ nutzen, denn dieser kann auch die Ausgaben von Programmen verarbeiten. Der folgende Befehl speichert die aktuellen Taskinformationen der jws.exe in der Variable "mystatus". Das Pipe-Zeichen muss in dieser Schreibweise escaped werden (^|):
for /f "tokens=*" %1 in ('tasklist ^| find /i "jfw.exe"') do set mystatus=%1

Der folgende Befehl schreibt die aktuelle IP-Adresse in die Variable %ip%. Sind mehrere IPv4-Adressen zugewiesen, so enthält die Variable anschließend die letzte Adresse in der Ausgabereihenfolge von ipconfig.
for /f "tokens=2 delims=:" %1 in ('ipconfig ^| find /i "v4" ') do set ip=%1

Will man noch das führende Leerzeichen loswerden, das mit in der Variable steht, so führt man anschließend folgenden Befehl aus:
for /f %1 in ('echo %ip%') do set ip=%1
Ich denke immer, dass das auch einfacher gehen muss, aber bisher kenne ich noch keinen besseren Weg.


Verzeichnispositionen merken: pushd und popd
Das wechseln twischen verzeichnissen mittels Kommandozeile ist in der heutigen Betriebssystemwelt eine der nervigeren Angelegenheiten. Möchte man einen kurzen Ausflug in ein anderes Verzeichnis machen und dann wieder zum aktuellen Punkt zurückkehren, so geht dies allerdings sehr einfach. Man wechselt damit zunächst mit pushd in ein anderes Verzeichnis, z.B. ins Hauptverzeichnis:
pushd \

Von hier aus kann man dann ganz normal mit cd in andere Verzeichnisse wechseln und tun, was auch immer man zu tun hat. Möchte man in das ursprüngliche Verzeichnis zurückkehren, so gibt man einfach popd ein. Das ganze funktioniert übrigens auch verschachtelt (für tekkis:Lifo-Stack), man kann also mehrere Verzeichnispositionen nacheinander mit pushd sichern und sie in umgekehrter Reihenfolge mit popd wieder abrufen.


UnxUtils


Im Internet gibt es eine Fülle von Kommandozeilenprogrammen, von denen viele sehr nützlich sein können. Eine der bestenSammlungen ist UnxUtils, eine Portierung zahlreicher Unix-Kommandos für Windows. Da Unix inSachen Kommandozeile weitaus mächtiger ist als Windows, ergeben sich mit diesen Tools völlig neue Möglichkeiten. Eionige der enthaltenen Kommandos sind sehr mächtig, andere ganz einfach, so wie beispielsweise das "tail"-Kommando. Ohne zusätzliche Parameter zeigt dieses die letzten zehn Zeilen einer oder mehrerer Textdateien an:
tail log.-txt

Das ist natürlich besonders praktisch bei Log-Dateien. Was aber, wenn man Änderungen verfolgen will? Dann ruft man tail einfach mit dem Parameter -f auf:
tail -f log.txt

Mit dieser Option bleibt tail gestartet und zeigt an, was neu an die Datei angehängtg wird. Auf diese Weise kann man also einer Logdatei während der Ausführung eines Befehls zuschauen, denn die Änderungen werden auch vom Screenreader angesagt. Beenden kann man die Anzeige mit Strg+C.

Die UnxUtils-Sammlung enthält noch weit über 100 weitere Kommandos, von MD5 oder CRCChecksummen über die grep-Suchfunktion bis zur Primfaktorzerlegung (und ja, Unix-Fans sind die ultimativen Nerds). Beim Ausprobieren solltet ihr daran denken, dass diese Kommandos Unix-Syntax verwenden. Wer also die Hilfe zu einem befehl lesen möchte, der muss "befehl --help" eingeben.


Eigene Kommandos definieren


doskey
Das doskey-Kommando erlaubt es, eigene Befehle in gestalt von befehlsaliasen oder Makros zu definieren. Entsprechende Anweisungen bleiben aber nur während der Sitzung erhalten. Alternativ könnte man eine batchdatei mit Starteinstellungen für die Eingabeaufforderung schreiben und diese über einen Registry-Eintrag starten. Mir persönlich ist das aber alles zu umständlich, ich nutze lieber den nachfolgenden Weg.


Batchdateien
Mit Hilfe von batchdateien kann man sich seine ganz eigenen Kommandos definieren. Die Möglichkeiten reichen von einfachen Syntaxabkürzungen bis zum komplexen Abläufen. Du möchtest deinen eignen dir-Befehl mit der Option /b? Erstell dir doch eine Batchdatei, z.B. mit dem Namen "xdir.bat", und schreibe den Befehl "@dir /b %*" hinein. Mit dieser Schreibweise kann man xdir sogar weitere Parameter übergeben.

Oder wie wäre es mit einer "mdcd.bar", die ein neues Verzeichnis erstellt und gleich hineinwechselt:

@echo off
md %1
cd %1


Visual Basic Script
Auch SVBS kann man nutzen, um sich seine eigenen kleinen oder großen Kommandos zu schreiben. Ein kleines Beispiel habe ich irgendwann im Internet gefunden. Das folgende Skript benutzt die Windows-eigene SAPI-Sprachausgabe, um Texte von der Kommandozeile aus sprechen zu lassen, was standardmäßig aber nur auf englisch möglich ist. Ich habe diese Datei bei mir say.vbs genannt:

set o=CreateObject("SAPI.SpVoice")
o.Speak Wscript.Arguments(0), 3
o.WaitUntilDone(-1)

Aufgerufen wird die Skriptdatei einfach wie eine Batchdatei:
say.vbs "Knock knock."
oder einfach
say "Knock knock."

Alternativ kann man das Skript auch mit cscript aufrufen, wobei dieses im Gegensatz zu start auf die Beendigung des Skriptes wartet:
cscript c:\bin\say.txt "Hello world!"

Mit einer kleinen Veränderung wird aus say.vbs ein Kommando zum Vorlesen einer Datei, dass ich bei mir sayfile.vbs getauft habe:

set o=CreateObject("SAPI.SpVoice")
o.Speak Wscript.Arguments(0), 5
o.WaitUntilDone(-1)

Dieses Skript sollte man unbedingt mit cscript afurfen, da es auf diese Weise sehr viel einfacher ist, die Sprachausgabe zu unterbechen (Strg+C).

Natürlich ist diese Vorgehensweise für einen Screenreader-Nutzer eher eine Krücke als eine Lösung. Falls jemand weiß, wie man von der Kommandozeile aus JAWS zum Sprechen bringt, wäre ich für einenTipp sehr dankbar, denn dass ist mir bisher noch nicht gelungen.


Und wohin nun mit den ganzen Batchdateien und Skripten?
Wer systemweit nutzbare Batchdateien, Skripte und Kommandozeilenprogramme nutzen möchte, der sollte sich für diese ein entsprechendes Verzeichnis anlegen (traditionell "C:\bin) und dieses Verzeichnis in den Pfad aufnehmen. Dazu einfach im Startmenü nach "Erweiterte Systemeinstellungen anzeigen" suchen und starten. Daraufhin öffnet sich ein Dialog, in dem man unter der Registerkarte "Erweitert" die Schaltfläche "Umgebungsvariablen" findet. Diese öffnet einen neuen Dialog, in dem man sowohl die Benutzervariablen (gültig für den aktuell angemeldeten benutzer) als auch die Systemvariablen (gültig für alle Benutzer) ändern kann. Die gesuchte Variable heißt "PATH" und man sollte im Regelfall die Benutzervariable verwenden.


Batchdatei zum Anzeigen von Befehlsausgaben im Editor


Zum Abschluss gibt es noch eine kleine, aber nützliche Batchdatei. Eine meiner persönlichen Vorlieben ist die Arbeit mit demEditor. Diesen benutze ich auch dazu, mir in aller Ruhe und mit vollem Funktionsumfang die Ergebnisse komplexerer Befehlsausgaben anzusehen. Und damit ich mir nicht jedesmal einen Wolf tippen muss, habe ich mir eine kleine Batchdatei erstellt, die einen beliebigen befehl ausführt, das Ergebnis in eine temporäre Datei umleitet und anschließend im Editor anzeigt. Diese Batchdatei heißt bei mir x.bat und liegt im Pfad. Will ich also einen befehl ausführen und das Ergebnis imEditor sehen, muss ich lediglich "x " davor schreiben. Dabei kann ich den Befehl ganz normal schreiben, aber natürlich (außer in verketteten Befehlen) keine Ausgabeumleitungen verwenden. Lediglich bei ver Verwendung des Pipe-Zeichens muss die gesamte befehlskette inAnführungszeichen gesetzt werden, und evtl. darin enthaltene Anführungszeichen "escaped" werden, indem man sie als ^" schreibt.

@ECHO OFF

REM Temporaeres Verzeichnis erzeugen
set mytemp=%temp%\np_batch_temp\
if not exist %mytemp% md %mytemp%

REM Temporaeren Dateinamen erzeugen und pruefen
:LOOP1
set outfile=%mytemp%%random%.txt
if exist %outfile% goto loop1

REM Kommando(s) ausfuehren, Ausgaben in temporaere datei schreiben und diese anzeigen
>%outfile% 2>&1 cmd /c %*
start %outfile%

Ein paar Hinweise zu dieser Batchdatei:
  • Die temporären Dateien werden innerhalb des temp-Verzeichnisses des aktuellen Benutzers in einem Verzeichnis namens "np_batch_temp" gespeichert. Der Dateiname wird zufällig erzeugt und auf Existenz geprüft.
  • Die Dateien werden nicht gelöscht. Der Grund dafür ist, dass ein sauberes Löschen der Datei ziemlich schwierig ist. Man könnte zwar einfach eine Sekunde warten und dann die Datei löschen, einiger Editoren (darunter Notepad++) reagieren aber auf Änderungen der geöffnetenDatei im Hintergrund. Wartet man auf das Schließen der Datei, so blockiert man die Eingabeaufforderung oder hat ein wartendes Fenster im Hintergrund herumstehen. Und zum Löschen der Datei per Registry braucht manAdmin-Rechte. Ich lasse die Dateien daher einfach stehen. Wen das stört, der kann ja z.B. bei jeder Anmeldung das nP-batch_temp-Verzeichnis automatisch löschen.
  • Die temporäre Datei wird mit der Windows-Standardanwendung für TXT-Dateien geöffnet (normalerweise Notepad).



Und jetzt wünsche ich euch einfach nur noch viel Spaß beim Ausprobieren!

Keine Kommentare:

Kommentar veröffentlichen