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, 4155 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
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
gelöst Selected Gridview Value in Variable schreiben (4)

Frage von reissaus73 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Abfrage Vergleiche mit Variable goto (4)

Frage von Zunaras zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...