Batch Zeilen Verschiebung verhindern?
Wie kann ich verhindern das sich die abstände in einer Zeile verrutschen wie z.b. hier
@echo off
:a
set a=abcde
set b=fghijk
echo ########################
echo # %a% # %b% #
echo ########################
pause
goto a
3 Antworten
Schätze, du möchtest einen klaren Rahmen, also z.B.
Dazu müsstest du mit der Länge der Variable rechnen und dann nur noch die entsprechende Anzahl Leerzeichen eintragen.
Eventuell hilft dir dieser Ansatz weiter:
windows - How do you get the string length in a batch file? - Stack Overflow
Nach dem Bild meinst du also die Ausgabe des Scripts.
Offensichtlich erhalten die Variablen dynamisch Werte verschiedener Länge.
Vermutlich verwendest du Tabulatoren. Wenn es dir darum geht, in einer Textkonsole dieser Art Texte spaltenweise anzuordnen, würde ich von Tabulatoren abraten - das wird wesentlich komplizierter, als auf eine bestimmte Anzahl von Zeichen mit Leerzeichen aufzufüllen.
Glücklicherweise geht das - wenn in Windows Batch auch nicht ganz trivial. Der einfachste Weg dürfte sein, eine genügend lange Reihe von Leerzeichen anzuhängen und dann die überflüssigen Zeichen rechts abzuschneiden.
Wenn du auf der Kommandozeile
set /?
eingibst, bekommst du eine knappe Zusammenfassung dessen, was der Befehl kann, die allerdings ziemlich vollständig ist.
Was hier fehlt, ist, dass man die Parameter von set in Anführungszeichen setzen kann:
set "a=abc123"
bedeutet dasselbe wie
set a=abc123
, allerdings können wir mit Anführungszeichen aus Dinge tun wie
set "a=abc123 "
, wodurch die Leerzeichen mit in die Variable a aufgenommen werden.
Variablenersetzungen werden auch innerhalb von Anführungszeichen ausgeführt, wir können also auch
set "a=%a% "
verwenden, um 10 Leerzeichen anzuhängen.
Die Kette der Leerzeichen sollte wenigstens so lang sein wie der längste Text, der (voraussichtlich) in der Variablen a steht.
Fehlt noch das Abschneiden. Hierfür brauchen wir, was set /? am Beispiel der Variablen PATH vorführt, und zwar den Teil mit :~. In unserem Fall:
set "a=%a:~0,10%"
(die Zahl vor dem Komma gibt an, wie viele Zeichen am Anfang übersprungen werden, die Zahl nach dem Komma, wie viele Zeichen mitgenommen werden).
Möglicherweise wird die Sache ein wenig übersichtlicher, wenn wir die anzuhängenden Leerzeichen in eine eigene Variable auslagern:
set "leer10= "
und später
set "a=%a%%leer10%"
set "a=%a:~0,10%"
Die Zahl 10 kann natürlich nach Bedarf angepasst werden.
Es ist sogar möglich, nur die Anzahl der Leerzeichen in eine Variable zu setzen und die Leerzeichenkette automatisch aufbauen zu lassen, aber das führt hier zu weit.
Das Programm kann rausfinden, wie viele Leerzeichen abgeschnitten (oder angehängt) werden müssen, aber das ist (wie gesagt) viel zu aufwendig. Deshalb der Umweg über das Abschneiden.
Aber ganz egal, auf welche Weise die nötige Anzahl an Leerzeichen angehängt wird - irgendwo muss das mal passieren. Dazu sehe ich aber nichts in deinem Code.
Entweder macht man das jedesmal, nachdem eine der Variablen gesetzt worden ist - am besten per Unterprogramm -, oder an einer zentralen Stelle - hier würde sich anbieten, das vor der Ausgabe zu tun.
Möglicherweise willst du auch die Original-Eingaben behalten, dann ist das Sinnvollste, für die Ausgabe eigene Variablen zu verwenden. Dazu kommt dann irgendwo zwischen :gls und dem ersten echo etwas wie
set "dateA=%date% "
set "dateA=%dateA:~0:12%"
set "a1A=%a1% "
set "a1A=%a1A:~0:12%"
etc.
Für a6 bis a20 ggf. eine andere Anzahl von Leerzeichen.
Ggf. über die Nummern der Variablen eine eigene Schleife laufen lassen.
-----
Außerdem sollten die Eingaben geprüft werden, ob sie nicht zu lang sind, und auch mit Sonderzeichen kann es Probleme geben (mit dem senkrechten Strich / Pipe-Symbol "|" WIRD es Probleme geben).
aber wie ermittele ich die länge des Textes in der variable
wen in der variable jetzt abc1234 steht funktioniert der wert 10 ja nicht mehr
Deshalb habe ich ja auch immer 10 Leerzeichen angehängt. In einem zweiten Schritt habe ich dann alle Zeichen nach dem 10. Zeichen abgeschnitten.
Aus
"abc1234"
wird erst einmal
"abc1234 "
und dann
"abc1234 "
Natürlich ist es auch möglich, die Länge des Textes zu ermitteln und eine Leerzeichenreihe zu erzeugen, die genau die Restlänge auffüllt. Das ist aber mit Windows Batch wesentlich komplizierter als diese Lösung.
Versuch es Mal den Datenpfad zu ändern. Es gibt bestimmte Tools online, wo du solche Namen in bestimmte Designs anpassen kannst Google einfach Mal ich kenne es nicht von der cmd aus sondern von CentOS oder Debian bin bash Scripte
sorry aber ich glaube ich bin zu blöd
wen ich jetzt z.b. einen Name eingebe dann muss das Programm doch wiesen wie viele lehrreichen weg müssen