heppy225
Goto Top

Batchdatei - eine Variable zusammensetzen, um daraus einen Dateinamen zu bilden

Hallo

nach dem ersten Gehversuch eine weitere Frage, deren Antwort ich selbst nicht finden konnte

Ich möchte mehrere Ordner automatisch anlegen lassen. Da dieser Vorgang täglich passiert, bietet sich eine Batchdatei an.
Da ein festes System in den Ordnernamen besteht, bietet sich eine FOR-Schleife als Lösung an.

Mein Gedankenansatz war, um verschiedene Ordnernamen durch eine FOR-Schleife zu verarbeiten, Variablen mit fortlaufender Nr zu erstellen.

counter=3
set T=DT

set A1=xxx
set A2=yyy
set A3=zzz

und diese dann mit dem Schleifenzähler %%i anzugeben:

FOR /L %%i IN (1,1,%counter%) DO (
md %A%%%i%T%
)

die Ordnernamen bestehen also aus zwei Teilen: den Variablen Ax und T. Das es nicht funktioniert ist klar.

Meine Frage: geht das überhaupt und wo liegt mein Gedanken- oder Syntaxfehler.

Content-Key: 166774

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

Printed on: April 19, 2024 at 13:04 o'clock

Member: Friemler
Friemler May 23, 2011 at 23:13:38 (UTC)
Goto Top
Hallo Heppy225,

um es nach Deiner Idee zu realisieren, könntest Du es so machen:
@echo off

setlocal

set "counter=3"  
set "T=DT"  

set "A1=xxx"  
set "A2=yyy"  
set "A3=zzz"  

for /l %%i in (1,1,%counter%) do (
  for /f "tokens=1* delims==" %%j in ('set a%%i') do (  
    echo md "%%k%T%"  
  )
)
Hier wird der SET-Befehl benutzt, um die indizierten Variablen A1-A3 auszugeben, mit delims== wird das Gleichheitszeichen der Ausgabe von SET als Trennzeichen definiert und durch tokens=1* enthält die automatisch erzeugte Laufvariable %%k alles rechts vom Gleichheitszeichen.

Oder unter Verwendung von verzögerter Variablenerweiterung:
@echo off

setlocal enabledelayedexpansion

set "counter=3"  
set "T=DT"  

set "A1=xxx"  
set "A2=yyy"  
set "A3=zzz"  

for /l %%i in (1,1,%counter%) do (
  echo md "!A%%i!%T%"  
)
Die verzögerte Variablenerweiterung muss benutzt werden, wenn man innerhalb eines geklammerten Befehlsblocks eine Variable setzen/verändern will und auch innerhalb dieses Blockes wieder verwenden will. Solche Variablen müssen statt mit % mit ! eingefasst werden und hinter SETLOCAL muss das Schlüsselwort EnableDelayedExpansion (Zeile 3). In Zeile 13 wären die Ausrufezeichen zwar nicht nötig, da A1-A3 vor der Schleife gesetzt und innerhalb der Schleife nicht verändert werden, aber so versteht der Befehlsinterpreter, was man mit A%%i meint.

Ausserdem geht sowas auch noch:
@echo off

setlocal

set "counter=3"  
set "T=DT"  

set "A1=xxx"  
set "A2=yyy"  
set "A3=zzz"  

for /l %%i in (1,1,%counter%) do (
  call echo md "%%A%%i%%%T%"  
)
Damit der Schnipsel funktioniert, nur das ECHO entfernen, CALL muss bleiben. Das ist ein Trick, durch den die Befehlszeile doppelt ausgewertet wird. Dabei sind dann aber die vielen Prozentzeichen notwendig (die Prozentzeichen um z.B. %A1% müssen verdoppelt werden). Die erste Auswertung erfolgt beim analysieren der Parameter für CALL. Dabei werden %%i und %T% durch ihren aktuellen Wert und die zwei Prozentzeichen vor A und nach i durch jeweils ein einzelnes ersetzt. MD (oder im Beispiel ECHO) wird dann z.B. mit %A1%DT aufgerufen. Bei der zweiten Auswertung wird dann %A1% durch seinen Wert ersetzt.

Eine (etwas einfachere) Alternative wäre:
@echo off

setlocal

set "T=DT"  
set "FirstPart="xxx" yyy "zzz""  

for %%i in (%FirstPart%) do (
  echo md "%%~i%T%"  
)
Zu Demonstrationszwecken habe ich mal einen Teil der Strings in FirstPart in Anführungszeichen gesetzt, somit könnten sie auch Leerzeichen enthalten. Die Anführungszeichen werden durch die Tilde in "%%~i%T%" entfernt.

Die Schnipsel machen nichts, sie geben wegen dem ECHO-Befehl innerhalb der FOR-Schleife nur aus, was passieren würde.

Gruß
Friemler
Member: bastla
bastla May 24, 2011 at 06:00:20 (UTC)
Goto Top
@Friemler
Da müsste dann ja wirklich für jede/n etwas dabei sein ... face-smile

Von "Pseudo"-Arrays (indizierten Variablen) in Batch halte ich recht wenig - daher würde ich zur letzten Version tendieren.
Ansonsten hätte ich noch eine weitere Variante:
@echo off & setlocal

set "T=DT"  

::DATA xxx
::DATA yyy
::DATA zzz and more

for /f "tokens=1*" %%i in ('findstr /b "::DATA" %0') do (  
    echo md "%%j%T%"  
)
Damit entfiele die Notwwendigkeit der Nummerierung und Anpassung der "for /l"-Schleife bzw deren Endwertes bei gleichzeitigem Beibehalten des Arguments "Übersichtlichkeit".

Die Kennzeichnung mit "DATA" hat natürlich nostalgische Gründe face-wink und könnte auch anders erfolgen ...

Grüße
bastla