Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Frage Entwicklung Batch & Shell

Mitglied: Heppy225

Heppy225 (Level 1) - Jetzt verbinden

24.05.2011 um 00:28 Uhr, 4163 Aufrufe, 2 Kommentare

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.
Mitglied: Friemler
24.05.2011 um 01:13 Uhr
Hallo Heppy225,

um es nach Deiner Idee zu realisieren, könntest Du es so machen:
01.
@echo off 
02.
 
03.
setlocal 
04.
 
05.
set "counter=3" 
06.
set "T=DT" 
07.
 
08.
set "A1=xxx" 
09.
set "A2=yyy" 
10.
set "A3=zzz" 
11.
 
12.
for /l %%i in (1,1,%counter%) do ( 
13.
  for /f "tokens=1* delims==" %%j in ('set a%%i') do ( 
14.
    echo md "%%k%T%" 
15.
16.
)
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:
01.
@echo off 
02.
 
03.
setlocal enabledelayedexpansion 
04.
 
05.
set "counter=3" 
06.
set "T=DT" 
07.
 
08.
set "A1=xxx" 
09.
set "A2=yyy" 
10.
set "A3=zzz" 
11.
 
12.
for /l %%i in (1,1,%counter%) do ( 
13.
  echo md "!A%%i!%T%" 
14.
)
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:
01.
@echo off 
02.
 
03.
setlocal 
04.
 
05.
set "counter=3" 
06.
set "T=DT" 
07.
 
08.
set "A1=xxx" 
09.
set "A2=yyy" 
10.
set "A3=zzz" 
11.
 
12.
for /l %%i in (1,1,%counter%) do ( 
13.
  call echo md "%%A%%i%%%T%" 
14.
)
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:
01.
@echo off 
02.
 
03.
setlocal 
04.
 
05.
set "T=DT" 
06.
set "FirstPart="xxx" yyy "zzz"" 
07.
 
08.
for %%i in (%FirstPart%) do ( 
09.
  echo md "%%~i%T%" 
10.
)
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
Bitte warten ..
Mitglied: bastla
24.05.2011 um 08:00 Uhr
@Friemler
Da müsste dann ja wirklich für jede/n etwas dabei sein ...

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:
01.
@echo off & setlocal 
02.
 
03.
set "T=DT" 
04.
 
05.
::DATA xxx 
06.
::DATA yyy 
07.
::DATA zzz and more 
08.
 
09.
for /f "tokens=1*" %%i in ('findstr /b "::DATA" %0') do ( 
10.
    echo md "%%j%T%" 
11.
)
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 und könnte auch anders erfolgen ...

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Exchange Server

WSUS bietet CU22 für Exchange 2007 SP3 nicht an. EOL Exchange 2007

Tipp von DerWoWusste zum Thema Exchange Server ...

Ähnliche Inhalte
Batch & Shell
Vergleich einer Zeichenfolge in zwei Dateinamen (1)

Frage von hongziehong zum Thema Batch & Shell ...

Batch & Shell
gelöst Ausgelagerte Variablen in Batchdatei (6)

Frage von mp-home zum Thema Batch & Shell ...

Batch & Shell
Batchdatei auf einem Server ausführen mit psexec.exe (16)

Frage von imebro zum Thema Batch & Shell ...

Batch & Shell
gelöst Dateien (PDF) umbenennen via batch, teilw. Dateinamen übernehmen, neues Präfix (6)

Frage von brause1701 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Batch & Shell
gelöst Batch xls nach aktuellem Datum auslesen und email senden (14)

Frage von michi-ffm zum Thema Batch & Shell ...

Windows Server
SBS 2011 Standard virtualisieren (13)

Frage von HeinrichM zum Thema Windows Server ...

Backup
Datensicherung ARCHIV (12)

Frage von fautec56 zum Thema Backup ...

LAN, WAN, Wireless
Per Script auf UniFi-controller zugreifen und WPA2-Key ändern (11)

Frage von Winfried-HH zum Thema LAN, WAN, Wireless ...