Wie kann ich Zahlen in einer Batch-FOR-Schleife auf Null setzen?

3

Ich schreibe eine Batchdatei, um einige Vorgänge auf entfernten Computern in meinem Gebäude auszuführen. Sie sind alle mit demselben Präfix benannt, aber die Zahl am Ende ändert sich (01–65). Ich habe versucht, einem Online-Lernprogramm zum Erstellen einer Batch-Datei-Schleife basierend auf Zahlen zu folgen, und kam zu folgendem Ergebnis:

FOR /l %%N in (1,1,65) do (
    set HOSTNAMETOUSE=prefix-%%N
    ECHO %HOSTNAMETOUSE%
)

Dies funktioniert gut, nachdem es 10 erreicht hat, da es zweistellig ist. Was ich brauche, ist für die Zahlen 1-9 als erscheinen 01-09, da dies unserem Benennungsschema entspricht. Grundsätzlich brauche ich für die ersten 9 Iterationen die einstellige Ziffer einer führenden Null. Wie kann ich dies mit Windows Batch-Dateien erreichen?

Canadian Luke
quelle

Antworten:

8

Ihr geposteter Code kann möglicherweise nicht funktionieren, weil %HOSTNAMETOUSE% wird erweitert, wenn die Anweisung analysiert wird und der gesamte Klammerblock in einem Durchgang analysiert wird, bevor die Schleife ausgeführt wird. Der erweiterte Wert ist also für alle Iterationen konstant.

Sie müssen eine verzögerte Erweiterung verwenden, um den Wert zur Ausführungszeit abzurufen.

@echo off
setlocal enableDelayedExpansion
FOR /l %%N in (1,1,65) do (
    set HOSTNAMETOUSE=prefix-%%N
    ECHO !HOSTNAMETOUSE!
)

Jetzt mit 0 voranstellen.

Da Sie nie mehr als eine 0 benötigen, können Sie eine IF-Anweisung verwenden.

@echo off
setlocal enableDelayedExpansion
FOR /l %%N in (1,1,65) do (
    if %%N lss 10 (set HOSTNAMETOUSE=prefix-0%%N) else set HOSTNAMETOUSE=prefix-%%N
    ECHO !HOSTNAMETOUSE!
)

Dies ist jedoch nicht praktisch, wenn Ihre Zahlenbreite mehr als zwei Ziffern beträgt. Eine allgemeinere Lösung ist das Hinzufügen einer Zeichenfolge von n Nullen mit der gewünschten Länge und verwenden Sie dann eine Teilzeichenfolge, um die Zeichenfolge beizubehalten n rechts die meisten Ziffern.

@echo off
setlocal enableDelayedExpansion
FOR /l %%N in (1,1,65) do (
    set "n=00%%N"
    set "HOSTNAMETOUSE=!n:~-2!
    ECHO !HOSTNAMETOUSE!
)

Sie können diese Lösung problemlos auf praktisch beliebig viele führende Nullen erweitern.

dbenham
quelle
Das hat wunderbar funktioniert! Ich muss nur daran denken, anstelle eines Prozentzeichens ein Ausrufezeichen zu verwenden. Vielen Dank!
Canadian Luke
0

Ich würde das so machen:

  • Addiere '0' zu jeder Zahl (also '01' aber auch '065')
  • Die letzten zwei Zeichen dieser Zeichenfolge sind Teilzeichenfolge

Wie machst du einen Teilstring in Batchdatei (2 letzte Zeichen):

SET string=abcd 
echo %string% 
SET string2=%string:~-2%
echo %string2%
mwilczynski
quelle
Kannst du eine Demo zeigen, am besten damit, wie das funktioniert? Ich bekomme die Variable nur 65 Mal geschlungen, wobei die Zahl immer 65 ist.
Canadian Luke
0

Verwenden ZtreeWin , navigieren Sie zum richtigen Verzeichnis, indem Sie drücken \ , dann drücken Eingeben um das Verzeichnis einzugeben, wo Sie können Ctrl T um die Dateien zu markieren, die Sie umbenennen möchten, und dann Ctrl R umbenennen in ????<0>*.*

Zum Beispiel:

foo-0-bar.jpg -> foo-00-bar.jpg
foo-1-bar.jpg -> foo-01-bar.jpg
foo-2-bar.jpg -> foo-02-bar.jpg
...

Im obigen Beispiel ???? steht für die ersten 4 Zeichen (foo-), <0> fügt an der 5. Stelle eine Null ein und *.* stellt den Rest des Dateinamens (-bar.jpg) dar, der unverändert bleibt.

Markieren Sie Ihre Dateien:

enter image description here

Umbenennen Ihrer Dateien:

enter image description here

ZTreeWin ist ein leistungsstarkes 32bit & amp; 64-Bit-Textmodusdatei & amp; Verzeichnismanager, der dem legendären XTreeGold (TM) nachempfunden ist, jedoch für heutige Betriebssysteme erweitert wurde.

AcornBBCnut
quelle
Hallo Eichel, willkommen bei Super User. Die Antwort, die Sie gepostet haben, ist von schlechter Qualität für das, was wir normalerweise akzeptieren. Kannst du es erweitern, wie das Programm funktioniert, wie du es gefunden hast (oder ob du es geschrieben hast), den Link und möglicherweise sogar einen Screenshot? Es sollte auch für andere Besucher in der Frage hilfreich sein. Sehen Wie soll ich antworten? für mehr Informationen. Vielen Dank!
Canadian Luke
Fertig - ich betrachte mich jetzt als geschlagen und die Lektion gelernt. :)
AcornBBCnut
Bitte. Vielen Dank für das Hinzufügen der Tastenkappen. :)
AcornBBCnut
0

Nichts Neues in @ dbenhams Antwort, nur ein paar Werte-Variablen, die von der Kommandozeile gesammelt wurden und hier zum leichteren Kopieren und Einfügen abgelegt wurden - alle @ dbenham-Credits stehen zur Verfügung:

set first=%1
set last=%2
set len=%3
setlocal EnableDelayedExpansion
FOR /l %%N in (%first%, 1, %last%) do (
    set "n=0000000000000%%N"
    set "padded=!n:~-%len%!
    echo !padded!
)
Chris
quelle