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, 4188 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 ..
Ähnliche Inhalte
Batch & Shell
Wildcard im Dateinamen möglich bei Batchdatei? (3)

Frage von imebro zum Thema Batch & Shell ...

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

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

Batch & Shell
Vergleich einer Zeichenfolge in zwei Dateinamen (3)

Frage von hongziehong zum Thema Batch & Shell ...

Batch & Shell
gelöst In Batchdatei Variablen befüllen - mit Werten aus einer TXT-Datei (6)

Frage von donnyS73lb zum Thema Batch & Shell ...

Neue Wissensbeiträge
Windows Server

Umstellung SHA 1 auf SHA 2 - Migration der CA von CSP auf KSP

Tipp von Badger zum Thema Windows Server ...

Windows 10

Quato DTP94 unter Windows 10 x64 installieren und verwenden

Anleitung von anteNope zum Thema Windows 10 ...

Windows 10

Win10 1703 und Nutzerkennwörter bei Ersteinrichtung - erstaunliche Erkenntnis

(15)

Erfahrungsbericht von DerWoWusste zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Internet
gelöst Jeden morgen Internet-Probleme (56)

Frage von pjrtvly zum Thema Internet ...

Server-Hardware
HP DL380 G7: Booten vom USB via USB 3.1-PCI-e Karte möglich? (24)

Frage von Paderman zum Thema Server-Hardware ...

LAN, WAN, Wireless
gelöst IP Adressen - Modem - Switch - Accesspoint (22)

Frage von teuferl82 zum Thema LAN, WAN, Wireless ...

Windows 7
Bluesreens unternehmensweit (22)

Frage von SYS64738 zum Thema Windows 7 ...