Top-Themen

Aktuelle Themen (A bis Z)

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

gelöst Tokens-Dateinamenzerlegungsproblem (Variablen werden überschrieben?)

Mitglied: Sodele

Sodele (Level 1) - Jetzt verbinden

31.07.2011, aktualisiert 10:31 Uhr, 3177 Aufrufe, 11 Kommentare

Hallo zusammen. Ich habe hier durch vielerlei Anregungen eine Batch halbwegs zum Laufen gebracht, die mir als Ergebnis aber immer nur die Werte der letzten Datei aus einem Ordner wiedergibt, wobei eigentlich alle berücksichtigt werden sollen. Da ich absoluter Laie bin (was man am Code vermutlich auch unschwer erkennen kann) hoffe ich auf eure Hilfe.

Aufgabe: Die Batch soll die Dateinamen aller Mediendateien in einem Ordner, in dem sie sich selbst befindet (ist aber kein Muss, meinetwegen darf sie ruhig eine Ebene hochrutschen) "zerstückeln" und zusammen mit der jeweiligen Dateigröße in eine XML zur Weiterverarbeitung schreiben.
Mein bisheriger Versuch sieht so aus:

01.
@echo off  
02.
@setlocal enabledelayedexpansion 
03.
 
04.
REM +++ Dateinamen zerlegen  
05.
FOR /f "delims=_ tokens=1-6" %%i in ('Dir /b C:\MyMedia\Test\*_*_*_*_*_*.*') do (  
06.
	set varGroup=%%i 
07.
	set varAlbum=%%j 
08.
	set varTitle=%%k 
09.
	set varNr=%%l 
10.
	set varBitrate=%%m 
11.
	set varType=%%n) 
12.
	 
13.
REM +++ Dateigrösse ermitteln 
14.
for /f "delims=" %%i in ('Dir /b C:\MyMedia\Test\*_*_*_*_*_*.*') do (  
15.
        set varSize=%%~zi) 
16.
 
17.
REM +++ XML Header schreiben 
18.
ECHO ^<?xml version="1.0" encoding="UTF-8"?^> >test.xml 
19.
ECHO ^<request^> >>test.xml 
20.
 
21.
REM +++ XML schreiben 
22.
FOR /f "delims=_ tokens=1-6" %%i in ('Dir /b C:\MyMedia\Test\*_*_*_*_*_*.*') do ( 
23.
ECHO 	^<item type="file"^> >>test.xml 
24.
ECHO 		^<filename^>%Dateiname%^</filename^> >>test.xml 
25.
ECHO 		^<group^>%varGroup%^</group^> >>test.xml 
26.
ECHO 		^<album^>%varAlbum%^</album^> >>test.xml 
27.
ECHO 		^<title^>%varTitle^</title^> >>test.xml 
28.
ECHO 		^<nr^>%varNr%^</nr^> >>test.xml 
29.
ECHO 		^<type^>%varType%^</type^> >>test.xml 
30.
ECHO 		^<bytes^>%varSize%^</bytes^> >>test.xml 
31.
ECHO 	^</item^> >>test.xml 
32.
33.
 
34.
REM +++XML Footer schreiben 
35.
ECHO ^</request^> >>test.xml 
36.
 
37.
 
38.
goto :eof  
39.
 
40.
:End  
41.
 
42.
Endlocal
Das Ganze liefert mir eigentlich schon den gewünschten Aufbau, nur leider schreibt er nur die Ergebnisse der letzten Datei hinein. Ich nehme also an, dass er die Variablen %%i-%%n überschreibt. Nur weiß ich leider nicht, wo ich da ansetzen soll. Außerdem wäre es nett, wenn ihr mir einen Tipp zum Schreiben des jeweiligen Dateinamens in die xml geben könntet, der sträubt sich auch noch. Vielen Dank schon mal.
Mitglied: Friemler
31.07.2011 um 10:57 Uhr
Hallo Sodele,

das sollte so gehen (ungetestet):
01.
@echo off & setlocal 
02.
 
03.
 
04.
set "Output=C:\test.xml" 
05.
 
06.
REM +++ XML Header schreiben 
07.
> "%Output%" ECHO ^<?xml version="1.0" encoding="UTF-8"?^> 
08.
>>"%Output%" ECHO ^<request^> 
09.
 
10.
pushd "C:\MyMedia\Test" 
11.
 
12.
REM +++ Dateinamen ermitteln 
13.
(FOR /f "delims=" %%a in ('dir /b "*_*_*_*_*_*.*"') do ( 
14.
   REM +++ Dateinamen zerlegen 
15.
   FOR /f "delims=_. tokens=1-6" %%i in ("%%a") do ( 
16.
     ECHO ^<item type="file"^> 
17.
     ECHO   ^<filename^>%%~na^</filename^> 
18.
     ECHO   ^<group^>%%i^</group^> 
19.
     ECHO   ^<album^>%%j^</album^> 
20.
     ECHO   ^<title^>%%k^</title^> 
21.
     ECHO   ^<nr^>%%l^</nr^> 
22.
     ECHO   ^<bitrate^>%%m^</bitrate^> 
23.
     ECHO   ^<type^>%%n^</type^> 
24.
     ECHO   ^<bytes^>%%~za^</bytes^> 
25.
     ECHO ^</item^> 
26.
27.
))>>"%Output%" 
28.
 
29.
popd 
30.
 
31.
REM +++XML Footer schreiben 
32.
>>"%Output%" ECHO ^</request^>
Daten, die man ermittelt hat, sollte man auch direkt verarbeiten, nicht erst 10 Zeilen weiter unten, nachdem die Schleife schon beendet ist. .

Die Ausgabeumleitung bei ECHO-Befehlen sollte man immer vor das ECHO schreiben, das vermeidet Fehlfunktionen des Codes, die tückischerweise nur unter bestimmten Umständen auftreten. Das hat aber nichts mit Deinem Fehler zu tun.

In Zeile 17 wird nur der Dateiname ohne Erweiterung in die XML-Datei geschrieben. Wenn es beides sein soll, schreibe statt %%~na einfach %%a.

Gruß
Friemler


[EDIT]
Code zur Erhöhung der Ausführungsgeschwindigkeit auf die Blockwrite-Methode von Mathe geändert.
[/EDIT]

[EDIT2]
Bugfix: Der Dateiname wurde falsch zerlegt.
[/EDIT2]
Bitte warten ..
Mitglied: mathe172
31.07.2011 um 11:00 Uhr
Hallo,

du musst nach dem setzten der Variablen (Z6-Z11) jedesmal Daten in die XML schreiben.
Etwa so:
01.
@echo off  
02.
REM +++ XML Header schreiben 
03.
(ECHO ^<?xml version="1.0" encoding="UTF-8"?^> 
04.
ECHO ^<request^> 
05.
)>"test.xml" 
06.
 
07.
REM +++ Alle Dateien abarbeiten (Schau mal "/s" bei "dir /?" and) 
08.
for /f "delims=" %%a in ('Dir /b C:\MyMedia\Test\*_*_*_*_*_*.*') do ( 
09.
REM +++ XML schreiben 
10.
FOR /f "delims=_ tokens=1-6" %%i in ("%~a") do ( 
11.
ECHO 	^<item type="file"^> 
12.
REM Hier musst du schauen, was du von %~a brauchst 
13.
ECHO 		^<filename^>%~na^</filename^> 
14.
ECHO 		^<group^>%%i^</group^> 
15.
ECHO 		^<album^>%%j^</album^> 
16.
ECHO 		^<title^>%%k^</title^> 
17.
ECHO 		^<nr^>%%l^</nr^> 
18.
ECHO            ^<bitrate^>%%m^</bitrate^> 
19.
ECHO 		^<type^>%n%^</type^> 
20.
ECHO 		^<bytes^>%~za^</bytes^> 
21.
ECHO 	^</item^> 
22.
))>>"test.xml" 
23.
 
24.
REM +++XML Footer schreiben 
25.
(ECHO ^</request^> 
26.
)>>"test.xml"
(Ungetestet)

MfG,
Mathe172
[Edit: Das war so klar dass wieder jemand schneller ist...]
Bitte warten ..
Mitglied: Skyemugen
31.07.2011 um 11:05 Uhr
Aloha,

zu viel Aufwand

Versuch' es doch so:
01.
@echo off & setlocal 
02.
 
03.
REM +++ XML Header schreiben 
04.
>test.xml ( 
05.
ECHO ^<?xml version="1.0" encoding="UTF-8"?^> 
06.
ECHO ^<request^> 
07.
08.
 
09.
FOR /f "delims=" %%a in ('Dir /b C:\MyMedia\Test\*_*_*_*_*_*.*') do (  
10.
FOR /f "delims=_ tokens=1-6" %%i in ('echo %%~a') do ( 
11.
>>test.xml ( 
12.
ECHO 	^<item type="file"^> 
13.
ECHO 		^<filename^>%%a^</filename^> 
14.
ECHO 		^<group^>%%i^</group^> 
15.
ECHO 		^<album^>%%j^</album^> 
16.
ECHO 		^<title^>%%k^</title^> 
17.
ECHO 		^<nr^>%%l^</nr^> 
18.
ECHO 		^<bitrate^>%%m^</nr^> 
19.
ECHO 		^<type^>%%n^</type^> 
20.
ECHO 		^<bytes^>%%~za^</bytes^> 
21.
ECHO 	^</item^> 
22.
23.
24.
25.
REM +++XML Footer schreiben  
26.
>>test.xml ECHO ^</request^> 
27.
pause 
28.
goto :eof
Anmerkung: Für die Dateigrößenausgabe muss die Batchdatei imselben Verzeichnis liegen, sonst müsste man den Code etwas anpassen

Ebenso ist bei dir Dateiname nicht definiert, also gehe ich vom eigentlichen, wirklichen, kompletten Dateinamen aus.
Desweiteren gab es bei dir keine Zeile, in der varBitrate genutzt wurde, auch diese habe ich dazugetragen und es fehlt bei dir sowieso ein Prozentzeichen in Zeile 27 ^_^.

Anyway: enabledelayedexpansion ohne Ausrufezeichen ist eh zwecklos aber auch die hätten hier nicht viel genutzt und wie du siehst: Man benötigt es auch gar nicht, da du die for-Variablen direkt nutzen kannst.

greetz André

EDIT AHA! Da wartet man extra, bis der Herr Friemler etwas postet, um sich die Arbeit zu sparen, da loggt er sich aus und ist nicht mehr da, also denkt man: Gut, dann mach' ich das und wenn man postet hat der Herr Friemler sich auch schon ganz weit wieder vorgedrängelt, ja, ja, ja *fg*

P.S.: @mathe, au weia, überfliege noch einmal deine ganzen for-Variablen, das wird nix ^_^ %~a ? %n% ? %~za ?
Bitte warten ..
Mitglied: mathe172
31.07.2011 um 11:08 Uhr
@Friemler:
Die Ausgabeumleitung bei ECHO-Befehlen sollte man immer vor das ECHO schreiben, das vermeidet Fehlfunktionen des Codes, die tückischerweise nur unter bestimmten Umständen auftreten.
Noch einfacher ist es bei grossen Blöcken, alles auf einmal umzuleiten

MfG,
Mathe172
Bitte warten ..
Mitglied: Sodele
31.07.2011 um 11:10 Uhr
Wow. Das ging ja wirklich fix. Vielen, vielen Dank euch beiden. Werde das mal gleich beides testen, v.a. Friemlers Version sieht schön viel schlanker als mein Ansatz aus.
Bitte warten ..
Mitglied: Friemler
31.07.2011 um 11:13 Uhr
Hallo Mathe,

in dem Fall hier kann man das auch ohne weiteres machen. Wenn der zu schreibende Text aber Klammern enthält (z.B. Inline-VBScript), kommen zu den üblichen Quertreibern &, < und >, die "escaped" werden müssen, noch die öffnende und schließende Klammer hinzu. Dann wird es meist zu unübersichtlich. Ich bevorzuge es deshalb, die Umleitung vor jede Zeile zu schreiben.

Gruß
Friemler
Bitte warten ..
Mitglied: Sodele
31.07.2011 um 11:14 Uhr
Vielen Dank auch dir Skyemugen. Gebt mir mal ein paar Minuten, um das alles nachzuvollziehen. Ist ja Wahnsinn, wie flott ihr seid. Danke!

So, habe mich jetzt mal durch eure Hilfe gearbeitet und es hat alles geklappt. Vielen Dank noch mal.

Nur noch eine kurze Frage zu Skymugen:

Wenn nach dem Code nichts mehr kommt, wieso muss ich dann eigentlich nach goto :eof? Ein einfaches EXIT wäre doch sinnvoller, oder übersehe ich da etwas? Und sehe ich das richtig, dass ich auf Endlocal verzichten kann?
Bitte warten ..
Mitglied: Skyemugen
31.07.2011 um 11:14 Uhr
Aloha Friemler,

das dauert aber länger, da dabei öfter die Datei geöffnet, beschrieben, geschlossen etc. wird :P (gut, hier nicht wirklich aber generell schon ^_^), zumindest hatte das mal der gute Phil erwähnt

greetz André
Bitte warten ..
Mitglied: Friemler
31.07.2011 um 11:19 Uhr
Moin André,

ja, das ist richtig, das kann sogar einen richtigen Geschwindigkeitsboost ergeben. Man muss das eben immer für den Einzelfall abwägen. Codeblöcke, die sehr oft abgearbeitet werden, sollte man wirklich besser mit der Blockwrite-Methode schreiben. Bei Codeblöcken, die nur 1, 2 Mal abgearbeitet werden, sollte man aufgrund der besseren Lesbarkeit darauf verzichten (zumindest wenn der zu schreibende Text Klammern enthält, ich habe das hier halt aus reiner Gewohnheit so gemacht ).

Gruß
Friemler
Bitte warten ..
Mitglied: bastla
31.07.2011 um 12:48 Uhr
Hallo Sodele und willkommen im Forum!
Wenn nach dem Code nichts mehr kommt, wieso muss ich dann eigentlich nach goto :eof?
Musst Du nicht.
Ein einfaches EXIT wäre doch sinnvoller, oder übersehe ich da etwas?
In den allermeisten Fällen ist "exit" ohne "/b" sinnlos - je nach Aufruf wird die CMD-Shell ohnehin automatisch geschlossen (bzw soll sie das gar nicht werden - Stichwort "Testen").
Und sehe ich das richtig, dass ich auf Endlocal verzichten kann?
Soferne es (wie oben) am Ende des Batches steht: ja.

Grüße
bastla
Bitte warten ..
Mitglied: Sodele
31.07.2011 um 13:42 Uhr
Okay, vielen Dank euch allen! Dann wünsche ich noch einen schönen Sonntag.
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

Warum Funktioniert der tokens befehl nicht

gelöst Frage von DomiZone1Batch & Shell5 Kommentare

Hallo liebe Administartor Community Ich Beis gleich in mein nicht vorhandenes lenkrad :D der befehl: for /f "delims=: tokens1,2" ...

Batch & Shell

1 Token aus einer TXT auslesen für jede Zeile und als Variable in Schleife nutzen

Frage von KriegstreiberBatch & Shell5 Kommentare

Die Beschreibung wird schwer was ich vorhabe. Ich versuchs mal zu erklären. Im Vorfeld ein Auszug der Textdatei: Ich ...

Windows 10

Wiederherstellung von überschriebener Textdatei

gelöst Frage von Zippo97Windows 105 Kommentare

Hallo Freunde, Mir ist leider ein böser Fehler passiert. Ich habe in einen Textdokument einen verdammt wichtigen Code gespeichert. ...

Windows 10

Windows 10 Registry wird immer wieder überschrieben

gelöst Frage von HanutaWindows 106 Kommentare

Hallo Zusammen, Ich habe für meine User die Berechtigungen für einen Registrybaum HKLM\Software umgeschrieben Leider haut es mir nach ...

Neue Wissensbeiträge
Windows Server

SBS 2011: Installation von KB4457144 schlägt beim Reboot fehl - Von Dienst gesperrte Schriftart ursächlich

Tipp von the-buccaneer vor 4 StundenWindows Server

Moinsen zusammen! Das hat mich einige graue Haare gekostet: Ein SBS 2011 weigerte sich schon im August, das monatl. ...

Windows Netzwerk
Browser-Lags und IPv6
Erfahrungsbericht von NixVerstehen vor 10 StundenWindows Netzwerk1 Kommentar

Hallo zusammen, wir betreiben als kleines Speditionsunternehmen ein überschaubares Windows-Netzwerk mit Win10-Clients sowie einem Server 2016 Essentials als "eierlegende ...

Humor (lol)

Erstaunlich, Windows mit extremer Laufzeit (Server) lol

Tipp von mathu vor 12 StundenHumor (lol)5 Kommentare

Was es so alles gibt. :-)

Windows Netzwerk

CGM Praxisarchiv funktioniert auf Clients nach Update auf 4.14 nicht mehr

Tipp von MOS6581 vor 1 TagWindows Netzwerk

Moin, ein Kunde setzt das CGM-Praxisarchiv ein. Mehrplatzinstallation mit SQL-Server. Nachdem letzte Woche auf die 4.14 aktualisiert wurde, funktionierte ...

Heiß diskutierte Inhalte
Hyper-V
Windows Serer 2016 Standard virtualisieren
gelöst Frage von fritte87Hyper-V33 Kommentare

Hallo zusammen, ich muss für eine kleine Firma ein entsprechendes neues kleines Konzept bauen. Ich habe einen Server Standard ...

LAN, WAN, Wireless
Kombiniere mehrere 4G Router zu einem Netzwerk - Anwendung kleine LAN (10-20 Leute)
Frage von HulkTheHeroLAN, WAN, Wireless24 Kommentare

Guten Mittag liebes Administrator - Fourm, ich hoffe ich habe das richtige Thema ausgewählt - ansonsten bitte gerne verschieben ...

Windows Server
Fileserver von 2012 R2 auf 2012R2
gelöst Frage von ThabeusWindows Server23 Kommentare

Moin moin, leider war in der Vergangenheit der Fokus des Betriebs nicht auf Langfristigkeit ausgelegt. Daher stehe ich jetzt ...

Router & Routing
Größere Zahl VPN-Verbindungen mit Fritz-Box einrichten
Frage von miscmikeRouter & Routing15 Kommentare

Hallo Zusammen, ich supporte verschiedene Kunden mit bestehenden LAN-LAN-Kopplungen via FritzBox (7490, FritzOS 7.01) . Anwendungen sind z.B. Kaspersky-KSC ...