schottenrock
Goto Top

Enfernen führender Null(en) mit set a schlägt fehl

Hallo liebe Community,

nach langem Suchen komme ich nicht drauf und benötige Hilfe bei einem BATCH (ja, es MUSS Batch sein, auch, wenn es besseres gibt):


set cnt=017
echo A-%cnt%-
rem erster Test: Hier kommt raus: A-017-

set /a cnt=%cnt%
rem mit dem set/a will ich nun die führenden Nullen entfernen und einen Wert bekommen, mit dem ich rechnen kann

echo B-%cnt%-
rem nächste Prüfung: Hier kommt nun B-15- raus. 
rem Bei einstelligen Werten kommt unter 8 immer der richtige Wert raus

Also irgendwie mißachte ich da wohl irgend ein Zahlenformat, aber ich habe keine Ahnung, wie ich das richtig machen soll.
Zur Info: Ich befinde mich innerhalb einer FOR-Schleife in einer Subroutine, dich ich in der FOR-Schleife per CALL aufrufe.
Eine Eingabe an der Kommandozeile bringt aber gleiche Fehler.

Bei 2-stelligen unter 017 immer 2 weniger
Bei 3-stelligen kommt z.b. bei 0777 als Ergebnis 511 ???
019 z.b. nimmt er gar nicht an.

Fehlermeldung:
Ungültige Zahl. Numerische Konstanten sind entweder dezimale (17),
hexadezimale (0x11) oder oktale (021) Zahlen.

Möchte mir jemand einen Tipp geben, was ich falsch mache, bzw. wie ich es richtig(er) mache?

Kurzer Hintergrund: %cnt% ist in meinem Fall IMMER 3-stellig. D.h. von 001-009, über 010-099 bis hin zu 100-999. Das Beispiel mit 0777 oben habe ich nur zum Testen gemacht, weil ich nicht weiterkam. Da aber das Ergebnis so kurios ist, nannte ich es Euch, vielleicht kommt da jemand schneller auf einen möglichen Fehler. Vielleicht gibt es auch einen anderen Trick ohne set/a?

Bereits im Voraus Besten Dank an alle, die sich die Zeit nehmen, mein Problem zu lesen, zu verstehen und mir zu helfen.

Viele Grüße
Der Schottenrock (da schaut man nicht drunter face-smile

P.S. Falls jemand möchte: Ich würde gerne eine Variable prüfen, ob diese numerisch ist (ich damit rechnen kann). set/a bricht hier ab und vieles andere auch...
Einfach wenn %var% = Zahl, dann goto Zahl sonst goto Buchstabe

Content-ID: 370543

Url: https://administrator.de/contentid/370543

Ausgedruckt am: 21.11.2024 um 21:11 Uhr

Friemler
Lösung Friemler 09.04.2018 aktualisiert um 18:33:26 Uhr
Goto Top
Hallo,

Zitat von @Schottenrock:

Also irgendwie mißachte ich da wohl irgend ein Zahlenformat, ...

richtig erkannt - Zahlen mit führenden Nullen werden in Batchscript als Oktal-Zahlen interpretiert (Zahlensystem mit der Basis 8).

Wenn es nur darum geht, führende Nullen zu entfernen:
set "Cnt=0010"
for /f "tokens=* delims=0" %%a in ("%Cnt%") do echo %%a

Allerdings halte ich es für geschickter, führende Nullen erst bei der Ausgabe des Variablenwertes hinzuzufügen und intern mit ganz normalen Zahlen zu operieren, dann hast Du auch keine Probleme mit der Interpretation als Oktal-Zahl.

Um immer eine dreistellige Zahl zu erhalten wäre der Code dann folgendermaßen:
set "CntOut=00%Cnt%"
echo %CntOut:~-3%

Grüße
Friemler
Schottenrock
Schottenrock 09.04.2018 um 18:52:41 Uhr
Goto Top
Hallo Friemler,

herzlichen Dank. Das wars. Ich habe den Schnipsel noch auf mein Beiuspiel zugeschnitten, falls jemand anderes mal ne Lösung sucht:
for /f "tokens=* delims=0" %%a in ("%cnt%") do set/a cnt=%%a  

Ich habe aber noch eine Verständnisfrage: mit delims=0 legst Du die 0 als Trennzeichen fest und Trennzeichen. Aber warum klappt dann 010 und 100? da sind ja auch nachstehende Nullen und die werden nicht als Trennzeichen gewertet.

Anmerkung zum "intern mit Zahlen rechnen": geht leider nicht, da schon zig Dateien, die verarbeitet werden müssen ganz dumm erfasst wurden:

Dokument1;ergänzender Text für Lesezeichen
Dokument7; auch mal ohne Text möglich
Lesezeichen-003;Kapitelüberschrift
Dokument11;eingerücktes Lesezeichen
Dokument12;eingerücktes Lesezeichen
Dokument13;eingerücktes Lesezeichen
Dokument14;wieder nach links / ausgerücktes Lesezeichen

Damit werden mit Ghostscript Lesezeichen (pdfmarks) erstellt. Jedes Dokument kann ein eigenes Lesezeichen haben. Die Kapitelüberschrift hat einen count-Eintrag (Lesezeichen-003), d.h. die nächsten 3 Lesezeichen sind unter der Kapitelüberschrift eingerückt. Eine Gleiderung also. Nun muss ich zunächst den eintrag Lesezeichen auswerten und wenn Lesezeichen, dann die letzten 3 nehmen und in den count-Eintrag schreiben. Natürlich könnte man auch am "-" trennen und mit normalen Zahlen arbeiten, aber es gibt halt schon sehr viele solcher Dateien...

Wir haben einen viele Gigabyte großen Pool an Artikeldokumenten und Anleitungen, etc. wenn man für ein Produkt regelmäßig 3 Dateien benötigt, die man einem Kunden schickt, dann muss man die 3 jedesmal mühsam aus dem Pool suchen. Mit dieser Lösung werden alle 3 Einzeldateien an diesem speziellen Tag in der jeweils aktuellen Fassung in 1 größeres Gesamtdokument mit Deckblatt und Lesezeichen zusammengefasst.
Friemler
Lösung Friemler 09.04.2018 um 19:16:31 Uhr
Goto Top
Zitat von @Schottenrock:

Ich habe aber noch eine Verständnisfrage: mit delims=0 legst Du die 0 als Trennzeichen fest und Trennzeichen. Aber warum klappt dann 010 und 100? da sind ja auch nachstehende Nullen und die werden nicht als Trennzeichen gewertet.

Alle führenden Nullen werden durch die Festlegung der 0 als Trennzeichen weggefiltert. Durch die Option tokens=* wird jedoch der Rest der Zeichenkette komplett übernommen und der Laufvariablen %%a zugewiesen.

Siehe auch mein Tutorial zur FOR-Schleife

Grüße
Friemler
Schottenrock
Schottenrock 09.04.2018 aktualisiert um 19:26:25 Uhr
Goto Top
Ok, verstanden. Vielen Dank für die Erläuterung.
Das Tutorial kenne ich und hat schon oft geholfen. Nur nicht dann, wenn man auf dem Schlauch steht face-wink
Wünsche Dir noch einen schönen Abend!