Dies kann tatsächlich ohne Erstellen einer temporären Datei erfolgen. Die von jeb und dbenham beschriebene Methode funktioniert auch mit einer Zieldatei, die keine Backspaces enthält. Der kritische Punkt ist, dass die von findstr.exe erkannte Linie nicht mit einer CRLF enden darf. Die naheliegende Textdatei zum Scannen mit einer Zeile, die nicht mit einer CRLF endet, ist der aufrufende Stapel selbst, vorausgesetzt, wir beenden ihn mit einer solchen Zeile! Hier ist ein aktualisiertes Beispielskript, das auf diese Weise funktioniert ...
Änderungen gegenüber dem vorherigen Beispiel:
- Verwendet einen einzelnen Bindestrich in der letzten Zeile als durchsuchbare Zeichenfolge. (Muss kurz sein und darf nirgendwo anders im Stapel erscheinen.)
- Routinen und Variablen umbenannt, um etwas objektorientierter zu sein :-)
- Eine Anrufstufe wurde entfernt, um die Leistung leicht zu verbessern.
- Kommentare hinzugefügt (Beginnend mit: #, um mehr wie die meisten anderen Skriptsprachen auszusehen.)
@echo off
setlocal
call :Echo.Color.Init
goto main
:Echo.Color %1=Color %2=Str [%3=/n]
setlocal enableDelayedExpansion
set "str=%~2"
:Echo.Color.2
:# Replace path separators in the string, so that the final path still refers to the current path.
set "str=a%ECHO.DEL%!str:\=a%ECHO.DEL%\..\%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%!"
set "str=!str:/=a%ECHO.DEL%/..\%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%!"
set "str=!str:"=\"!"
:# Go to the script directory and search for the trailing -
pushd "%ECHO.DIR%"
findstr /p /r /a:%~1 "^^-" "!str!\..\!ECHO.FILE!" nul
popd
:# Remove the name of this script from the output. (Dependant on its length.)
for /l %%n in (1,1,12) do if not "!ECHO.FILE:~%%n!"=="" <nul set /p "=%ECHO.DEL%"
:# Remove the other unwanted characters "\..\: -"
<nul set /p "=%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%%ECHO.DEL%"
:# Append the optional CRLF
if not "%~3"=="" echo.
endlocal & goto :eof
:Echo.Color.Var %1=Color %2=StrVar [%3=/n]
if not defined %~2 goto :eof
setlocal enableDelayedExpansion
set "str=!%~2!"
goto :Echo.Color.2
:Echo.Color.Init
set "ECHO.COLOR=call :Echo.Color"
set "ECHO.DIR=%~dp0"
set "ECHO.FILE=%~nx0"
set "ECHO.FULL=%ECHO.DIR%%ECHO.FILE%"
:# Use prompt to store a backspace into a variable. (Actually backspace+space+backspace)
for /F "tokens=1 delims=#" %%a in ('"prompt #$H# & echo on & for %%b in (1) do rem"') do set "ECHO.DEL=%%a"
goto :eof
:main
call :Echo.Color 0a "a"
call :Echo.Color 0b "b"
set "txt=^" & call :Echo.Color.Var 0c txt
call :Echo.Color 0d "<"
call :Echo.Color 0e ">"
call :Echo.Color 0f "&"
call :Echo.Color 1a "|"
call :Echo.Color 1b " "
call :Echo.Color 1c "%%%%"
call :Echo.Color 1d ^"""
call :Echo.Color 1e "*"
call :Echo.Color 1f "?"
:# call :Echo.Color 2a "!"
call :Echo.Color 2b "."
call :Echo.Color 2c ".."
call :Echo.Color 2d "/"
call :Echo.Color 2e "\"
call :Echo.Color 2f "q:" /n
echo(
set complex="c:\hello world!/.\..\\a//^<%%>&|!" /^^^<%%^>^&^|!\
call :Echo.Color.Var 74 complex /n
exit /b
:# The following line must be last and not end by a CRLF.
-
PS. Ich habe ein Problem mit der Ausgabe der! Zeichen, das Sie im vorherigen Beispiel nicht hatten. (Oder zumindest hatten Sie nicht die gleichen Symptome.) Zu untersuchen.
!
kann mit einemcall :Echo.Color 2f ^^^!
oder gelöst werden, wenn die verzögerte Erweiterung beim Aufruf von usecall :Echo.Color 2f ^^^^^^^!
/V
Option mit einer Suchzeichenfolge von verwenden$
. Der FINDSTR-Regex $ -Anker sucht nach CR! Es ist auch nicht erforderlich, die Länge des Dateinamens jedes Mal zu berechnen. Dies kann während der Initialisierung erfolgen, und die Löschzeichen können in eine Zeichenfolge "Konstante" eingefügt werden.Sie können mehrfarbige Ausgaben ohne externe Programme ausführen.
Es verwendet die Farbfunktion des Befehls findstr.
Findstr kann so konfiguriert werden, dass Zeilennummern oder Dateinamen in einer definierten Farbe ausgegeben werden.
Also erstelle ich zuerst eine Datei mit dem Text als Dateinamen und der Inhalt ist ein einzelnes
<backspace>
Zeichen (ASCII 8).Dann suche ich alle nicht leeren Zeilen in der Datei und in nul, damit der Dateiname in der richtigen Farbe ausgegeben wird, an die ein Doppelpunkt angehängt ist, aber der Doppelpunkt wird sofort von der entfernt
<backspace>
.EDIT: Ein Jahr später ... sind alle Zeichen gültig
Dies verwendet die Regel für gültige Pfad- / Dateinamen.
Wenn sich a
\..\
im Pfad befindet, wird das vorangestellte Element vollständig entfernt und es ist nicht erforderlich, dass dieses Element nur gültige Dateinamenzeichen enthält.quelle
echo(
del /f /q X
;) Sehr schöne Lösung ..Jebs bearbeitete Antwort kommt der Lösung aller Probleme nahe. Es gibt jedoch Probleme mit den folgenden Zeichenfolgen:
Ich habe seine Technik so geändert, dass sie meiner Meinung nach wirklich mit jeder Reihe druckbarer Zeichen umgehen kann, mit Ausnahme von Längenbeschränkungen.
Weitere Verbesserungen:
Verwendet den Speicherort% TEMP% für die temporäre Datei, sodass kein Schreibzugriff mehr auf das aktuelle Verzeichnis erforderlich ist.
Es wurden 2 Varianten erstellt, eine verwendet ein Zeichenfolgenliteral, die andere den Namen einer Variablen, die die Zeichenfolge enthält. Die variable Version ist im Allgemeinen weniger praktisch, beseitigt jedoch einige Probleme beim Entkommen von Sonderzeichen.
Die Option / n wurde als optionaler dritter Parameter hinzugefügt, um eine neue Zeile am Ende der Ausgabe anzuhängen.
Die Rücktaste funktioniert nicht über einen Zeilenumbruch hinweg, sodass die Technik Probleme haben kann, wenn die Zeile umbrochen wird. Das Drucken einer Zeichenfolge mit einer Länge zwischen 74 und 79 funktioniert beispielsweise nicht ordnungsgemäß, wenn die Konsole eine Zeilenbreite von 80 hat.
UPDATE 27.11.2012
Diese Methode schlägt unter XP fehl, da FINDSTR die Rücktaste als Punkt auf dem Bildschirm anzeigt. Jebs ursprüngliche Antwort funktioniert unter XP, allerdings mit den bereits erwähnten Einschränkungen
UPDATE 14.12.2012
Bei DosTips und SS64 gab es viele Entwicklungsaktivitäten . Es stellt sich heraus, dass FINDSTR auch Dateinamen mit erweitertem ASCII beschädigt, wenn diese in der Befehlszeile angegeben werden. Ich habe meine FINDSTR-Fragen und Antworten aktualisiert .
Unten finden Sie eine Version, die unter XP funktioniert und ALLE Einzelbyte-Zeichen außer 0x00 (nul), 0x0A (Zeilenvorschub) und 0x0D (Wagenrücklauf) unterstützt. Unter XP werden die meisten Steuerzeichen jedoch als Punkte angezeigt. Dies ist eine inhärente Funktion von FINDSTR unter XP, die nicht vermieden werden kann.
Leider verlangsamt das Hinzufügen von Unterstützung für XP und für erweiterte ASCII-Zeichen die Routine :-(
Nur zum Spaß habe ich einige farbige ASCII-Kunstwerke aus der ASCII Art Gallery von Joan Stark genommen und sie für die Verwendung mit ColorPrint angepasst. Ich habe einen a: c-Einstiegspunkt nur zur Abkürzung und zur Behandlung eines Problems mit Anführungszeichen hinzugefügt.
quelle
Wenn Sie ein modernes Windows haben (auf dem Powershell installiert ist), funktioniert möglicherweise auch Folgendes
Passen Sie die Farbe nach Belieben an.
quelle
Durch die Kombination von Dbenhams Vogel und Syntax mit Skrebbels Powershell-
write-host
Methode scheint Powershell komplexe Kunst schneller rendern zu können als Dbenhams reine Batch-Methode (naja, nachdem Powershell ohnehin einmal grundiert wurde). Es ist ein minimales Massieren der Saiten erforderlich, obwohl ich dies mit nichts anderem als dem Vogel getestet habe. Wenn Sie beispielsweise ein hellgrünes Zeichen für das Ende der Übertragung wünschen, haben Sie möglicherweise kein Glück. :)Diese Methode erfordert das Echo in eine temporäre Datei, einfach weil das Aufrufen von Powershell für jede für
call :c
immer dauert und es viel schneller ist, die Ausgabe für einen Powershell-Aufruf in die Warteschlange zu stellen. Es hat jedoch den Vorteil der Einfachheit und Effizienz.Ergebnis:
quelle
Ohne externe Tools. Dies ist ein selbstkompilierter bat / .net-Hybrid (sollte gespeichert werden als
.BAT
), der auf jedem System verwendet werden kann, auf dem .net-Framework installiert ist (es ist selten, dass Windows ohne .NET-Framework auch für das älteste XP / 2003-Installationen). Es verwendet den jscript.net-Compiler, um eine Exe zu erstellen, die Zeichenfolgen mit unterschiedlichen Hintergrund- / Vordergrundfarben nur für die aktuelle Zeile drucken kann.Beispiel
coloroutput.bat -s "aa\nbb\n\u0025cc" -b 10 -f 3 -n -e
Sie können auch die Farbfunktion von Carlos überprüfen -> http://www.dostips.com/forum/viewtopic.php?f=3&t=4453
quelle
Ja, mit cmdcolor ist das möglich :
hi
wird dunkelgrün undworld
- hellgrün sein.quelle
In
"51} werden verschiedene Methoden behandelt. Wie kann ich in NT-Skripten Linien in verschiedenen Farben wiedergeben?"
http://www.netikka.net/tsneti/info/tscmd051.htm
Eine der Alternativen: Wenn Sie QBASIC erwerben können, ist die Verwendung von Farben relativ einfach:
quelle
Sie sollten chgcolor.zip von http://www.mailsend-online.com/blog/setting-text-color-in-a-batch-file.html herunterladen und echoj.zip auch von www.mailsend-online.com herunterladen / blog /? p = 41 Sie befinden sich beide am Ende der Seite. Extrahieren Sie beide Ordner auf den Desktop und kopieren Sie die ausführbaren Dateien (EXE-Dateien) aus den extrahierten Ordnern in das Verzeichnis C: \ Windows. Dadurch können sie über die Befehlszeile ausgeführt werden. Öffnen Sie den Editor und kopieren Sie Folgendes hinein:
Speichern Sie die Datei auf dem Desktop als hi.bat. Öffnen Sie nun die Eingabeaufforderung, navigieren Sie zu Ihrem Desktop-Ordner und geben Sie "hi.bat" ohne Anführungszeichen ein. Damit sollten Sie sicher sein, beide Webseiten zu lesen, um ein vollständiges Tutorial zu erhalten.
quelle
Wenn Ihre Konsole ANSI-Farbcodes unterstützt (z. B. ConEmu , Clink oder ANSICON ), können Sie dies tun:
wobei die ESC-Variable das ASCII-Zeichen 27 enthält.
Ich habe hier eine Möglichkeit gefunden, die ESC-Variable zu füllen: http://www.dostips.com/forum/viewtopic.php?p=6827#p6827 und
tasklist
damit zu testen, welche DLLs in einen Prozess geladen werden.Das folgende Skript ruft die Prozess-ID der cmd.exe ab, in der das Skript ausgeführt wird. Überprüft, ob eine DLL vorhanden ist, die ANSI-Unterstützung hinzufügt, und legt dann fest, dass Farbvariablen Escape-Sequenzen enthalten oder leer sind, je nachdem, ob Farbe unterstützt wird oder nicht.
quelle
Nachdem meine vorherige Antwort gelöscht wurde, weil der Code nicht enthalten war, können die verwendeten Ansi-Zeichen nicht durch Stapelüberlauf angezeigt werden, wodurch das Vorhandensein des Codes etwas sinnlos wird, da er darauf basiert. Ich habe den Code so umgestaltet, dass er den Code enthält Methode zum Auffüllen des von @Sam Hasler beschriebenen Escape-Zeichens
Dabei habe ich auch alle Unterprogramme zugunsten von Makros entfernt und meinen Ansatz an die Übergabe von Parametern an die Makros angepasst.
Alle Makros gleichen die Setlocal / Endlocal-Paarungen aus, um zu verhindern, dass die Rekursionsstufen überschritten werden, indem sie
^&^& endlocal
nach Abschluss ihrer Behandlung der Args verwendet werden.Das Makro std.out zeigt auch, wie die Makros angepasst werden, um die Ausgabe in Variablen zu speichern, die über die endlokale Barriere hinaus überleben.
Mein Dank geht an @Martijn Pieters für das Löschen meiner vorherigen Antwort. Beim Umschreiben meines Codes habe ich auch einige neue Möglichkeiten entdeckt, Makros zu manipulieren.
quelle
Windows 10 ((Version 1511, Build 10586, Release 2015-11-10)) unterstützt ANSI-Farben .
Mit der Escape-Taste können Sie die Farbcodes auslösen.
In der Eingabeaufforderung:
Echo Ctrl+ [
[32m HI
Ctrl+[[0m
EnterBei Verwendung eines Texteditors können Sie ALT-Tastencodes verwenden.
Der Code ESC - Taste kann folgendermaßen angelegt werden ALTund NUMPADZahlen: Alt+
027
quelle