Batch Zeilen Verschiebung verhindern?

Marty35  17.08.2022, 14:18

In welchem Programm hast du das denn eingefügt ?

Denle 
Beitragsersteller
 17.08.2022, 14:22

ich programmiere mit Notepad ++ und speichere es als .bat datei

3 Antworten

Von Experte Erzesel bestätigt

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.

Woher ich das weiß:Berufserfahrung – Software-Entwickler

Denle 
Beitragsersteller
 17.08.2022, 16:17

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

:np
set z=1
set gl=1
set na1=9999
set na2=aktiviert
cls
title neues profiel erstelen
:gl
set a%gl%= ?
set/a gl = %gl% + 1
if %gl%== 21 goto glf
goto gl
:glf
cls

echo Reg. seid	     %date%       #   Frage 1:   %a6%    #				
echo.                             #   Frage 2:   %a7%    #
echo Vorname:	     %a1%         #   Frage 3:   %a8%    #
echo.                             #   Frage 4:   %a9%    #
echo Nachname:       %a2%         #   Frage 5:   %a10%   #
echo.                             #   Frage 6:   %a11%   #
echo Geburdsdatum:   %a3%         #   Frage 7:   %a12%   #
echo.                             #   Frage 8:   %a13%   #
echo Gechlecht:	     %a4%         #   Frage 9:   %a14%   #
echo.                             #   Frage 10:  %a15%   #
echo Telefonnumer:   %a5%         #   Frage 11:  %a16%   #	 
echo.                             #   Frage 12:  %a17%   #
echo ID:             %na1%        #   Frage 13:  %a18%   #
echo.                             #   Frage 14:  %a19%   #
echo Status:         %na2%        #   Frage 15:  %a20%   #
echo                              #                      #
echo #####################################################
set/p a%z%=:
set/a z = %z% + 1
if %z%== 22 goto refer
goto glf
:refer
cls
echo fertig
pause
goto np
PWolff  17.08.2022, 16:50
@Denle

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).

Denle 
Beitragsersteller
 17.08.2022, 15:41

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

PWolff  17.08.2022, 15:46
@Denle

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