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 Hilfe bei Batchdatei

Mitglied: mkdeluxe

mkdeluxe (Level 1) - Jetzt verbinden

19.12.2005, aktualisiert 22.12.2005, 6842 Aufrufe, 8 Kommentare

Hallo zusammen,

ich arbeite gerade (zum ersten Mal) mit einer Batch Datei, und brauche kurz Eure Hilfe beim Verständnis. Was macht folgender Abschnitt?

SET FILENAME=Test
IF EXIST "D:\DATEN\Test" (
dir "D:\DATEN\%FILENAME%" > "D:\DATEN\temp.dat"
for /F "tokens=1,2,3 delims=: " %%i in ('findstr Test temp.dat') do call :SUB %%i %%j %%k )

So weit ich das bisher verstanden habe, wird ein Filename deklariert (=Test), und wenn diese Datei existiert (im Verzeichnis D:\...)
dann wird in dem Verzeichnis die Datei mit neuem Dateinamen (temp.dat) reingeschrieben.
Aber, was macht der Rest (for tokens... delims... %%i in...? Am Ende wird dann eine SUB aufgerufen, und wofür stehen dabei %%i %%j %%k?)

So, dann kommt noch in der SUB etwas, dass ich auch nicht verstehe...

:SUB
SET DSTUNDE=%2
SET DMINUTE=%3
SET JAHR=%date:~-2%
SET MONAT=%date:~3,2%
SET TAG=%date:~0,2%
rem SET STUNDE=%time:~0,2%
rem SET MINUTE=%time:~3,2%
SET NEWFILENAME=%MONAT%%TAG%%DSTUNDE%%DMINUTE%.%JAHR%
ren "D:\DATEN\Test" "%NEWFILENAME%"
del "D:\DATEN\temp.dat"

Schon klar, hier wird der Dateiname verändert. Sprich, Dateistunde,-Minute,Jahr, etc. ausgelesen? und später (SET NEWFILENAME, ren...) eingesetzt. Und der temporäre Dateiname temp.dat wird gelöscht. Was ich nicht verstehe: Was passiert durch die Zahlen, also z.B.
SET STUNDE=%2 ?

Und was könnte der Sinn für den Zwischenschritt mit der temp.dat sein?

Danke im Voraus für Eure Hilfe!

Grüße, mkdeluxe
Mitglied: edv-guru
LÖSUNG 19.12.2005, aktualisiert 19.02.2015
Hallo,
Soweit ich das kapiere,wird im 1.Teil die Variable Filename=Test gesetzt.Dann wird überprüft, ob eine Datei Existiert, in der der Verzeichnisinhalt(in dem Fall das vorkommen der Datei von Variable FILENAME) von D:\Daten\ steht,wenn nicht wird sie angelegt.
Dann wird sie ausgelesen, wobei mit der for Schleife(siehe cmd --> "help for"oder auch"for /?")die Datei in einer gewissen Länge eingelesen wird.
Im 2.Teil werden verschiedene Variablen mit SET deklariert, wobei(meines Wissens nach) %2 usw. Parameter an die B.Datei sind. dann passiert was undefinierbares ( *ggg*) und dann wird die Datei mit REN umbenannt und die Alte Datei gelöscht.

Gruß
EDV-guru

P.S.: Für weitere Erklärungen warte auf Biber.
Bitte warten ..
Mitglied: mkdeluxe
19.12.2005 um 15:15 Uhr
Hm...

erst mal danke für die Erklärung. Aber so ganz scheine ich das noch nicht verstanden zu haben... Ich habe mal versucht die beiden Teile halt testweise zusammen zu stellen:

@echo off

SET OLDFILENAME=%TEST%
IF EXIST "Y:\TEST" (
dir "Y:\%OLDFILENAME%" > "Y:\temp.dat "
for /F "tokens=1,2,3 delims=: " %%i in ('findstr TEST temp.dat') do call :SUB %%i %%j %%k )

:SUB
SET DSTUNDE=%2
SET DMINUTE=%3
SET JAHR=%date:~-2%
SET MONAT=%date:~3,2%
SET TAG=%date:~0,2%
rem SET STUNDE=%time:~0,2%
rem SET MINUTE=%time:~3,2%
SET FILENAME=%MONAT%%TAG%%DSTUNDE%%DMINUTE%.%JAHR%
Pause
REN "D:\TEST" "%FILENAME%"

So genau weiß ich zwar nicht was ich da für Stunden und Minuten eingebe, aber das ist erst mal unwichtig. Viel verwirrender ist folgendes: Bis zur Pause läuft das Programm problemlos, aber hinter der Pause bekomme ich die Fehlermeldung: "Das System konnte die angegebene Datei nicht finden." Und zwar egal, ob ich die Datei jetzt im Ordner habe oder nicht. Der Fehler liegt also wohl in meinem REN Befehl, aber wo?
Bitte warten ..
Mitglied: drop-ch
LÖSUNG 19.12.2005, aktualisiert 19.02.2015
Hi

Bei mir funktioniert der Batch soweit ohne Probleme.
Was mich stört - und wohl auch das OS - dann du bei der letzten Zeile d:\test stehen hast....vorher war es noch y:\test.

Korrigiere mal den Pfad...dann geht der Batch auch.

gretz drop
Bitte warten ..
Mitglied: Biber
LÖSUNG 19.12.2005, aktualisiert 19.02.2015
Moin mkdeluxe,

Ivo hat so weit recht... mit der Korrektur könnte es laufen.
Aber Du wolltest ja auch wissen, was in diesem Schnipsel abgeht. Ich versuchs mal ein Stück weit aufzudröseln. Das meiste hast Du ja schon selbst verstanden.

(ich nehme mal den oberen Batch
------schnipsel Hauptteil------
SET FILENAME=Test
IF EXIST "D:\DATEN\Test" (
dir "D:\DATEN\%FILENAME%" > "D:\DATEN\temp.dat"
for /F "tokens=1,2,3 delims=: " %%i in ('findstr Test temp.dat') do call :SUB %%i %%j %%k )
------schnipsel Hauptteil------

In den ersten drei Zeilen macht der Verfasser seinen eigentlichen Hauptfehler: Er definiert sich eine Variable namens FILENAME mit dem Inhalt "Test"... und fragt aber schon in der nächsten Zeile wieder mit einem hart codierten 'IF EXIST "D:\Daten\Test" '... die Existenz dieser angeblich variablen Datei ab. Geht natürlich in die Grütze, wenn Du statt "SET Filename=Test" irgendwann "Set FileName=*.log" schreibst - das Programm macht immer noch alles davon abhängig, ob eine Datei "Test" existiert...

Also, den kleinen Bug noch weggebügelt, sieht der Hauptteil dann so aus:
------schnipsel2 Hauptteil------
SET "FILENAME=Test"
IF EXIST "D:\DATEN\%FileName%" (
dir "D:\DATEN\%FILENAME%" > "D:\DATEN\temp.dat"
for /F "tokens=1,2,3 delims=: " %%i in ('findstr Test temp.dat') do call :SUB %%i %%j %%k )
------schnipsel2 Hauptteil------

>>..ich das bisher verstanden habe, wird ein Filename deklariert (=Test)
Jepp.
und wenn diese Datei existiert (im Verzeichnis D:\...)
Jepp.
dann wird in dem Verzeichnis die Datei mit neuem Dateinamen (temp.dat) reingeschrieben.
Nada.
In der (Teil-)Zeile [dir "D:\DATEN\%FILENAME%" ] wird nicht die Datei "test" irgendwohin geschrieben, sondern nur die Dateiinformationen von "test". Ausgeführt wird ein simples
dir D:\Daten\test
...welches folgenden Output schreiben könnte:
>dir d:\Daten\test
Datenträger in Laufwerk D: ist Daten
Volumeseriennummer: 8F92-3411

Verzeichnis von d:\Daten

19.12.2005 19:53 26 test
1 Datei(en) 26 Bytes
0 Verzeichnis(se), 773.840.896 Bytes frei

Dieser Output wird als Textdatei "temp.dat" irgendwohin geschrieben.

>>Aber, was macht der Rest (for tokens... delims... %%i in...?

Von dieser Zwischendatei wiederum ist für den Batch nur eine Zeile interessant, die Zeile mit dem Dateinamen "test" . Diese Zeile holt er mit dem "findstr TEST temp.dat".

...aus dieser Zeile wiederum will der Autor die Stunden und Minuten rausfieseln. Dazu gibt er dem FOR /F IN..DO..-Befehl die Anweisung
Trenne den Inhalt der Zeile 19.12.2005 19:53 26 test
in "Tokens" (Einzelteile, Elemente..) und fasse Doppelpunkt und SPACE als Trennzeichen auf.
Und nimm davon die Tokens 1,2 und 3 ...der Rest kann in die Tonne.
"tokens=1,2,3 delims=: "
19.12.2005 19:53 26 test--------> nach dieser Regel ergibt:
19.12.2005 ist Token1
19 (die 19 von der Uhrzeit) ist Token 2
53 (die Minuten) ist Token 3
<s> 26 test</s> wird nicht beachtet; sind die Token 4 und 5

>>und wofür stehen dabei %%i %%j %%k?)

Diese drei Token werden über automatisch generierte Zählvariablen "transportiert", von denen nur die erste definiert werden muss. Der Autor hat %%i als Zählvariable genommen.
Also:
Token1----> kommt "hinter dem ..DO.." an als %%i .......Inhalt "19.12.2005"
Token2----> kommt "hinter dem ..DO.." an als %%j........Inhalt "19" (Stunden)
Token3----> kommt "hinter dem ..DO.." an als %%k.......Inhalt "53" (Minuten)

Mit diesen Werten wird eine "Subroutine" namens ":SUB" gerufen.
Diese :SUB kennt natürlich nicht diese ganze Vorgeschichte und will sie auch gar nicht wissen.. diese :SUB "weiß" nur: Sie bekommt drei Parameter übergeben.
Die heißen dann der Einfachheit halber %1, %2, %3..


Am Ende wird dann eine SUB aufgerufen, ...
>>So, dann kommt noch in der SUB etwas, dass ich auch nicht verstehe...
..das geht mir auch so...kopfschüttel

--------SchnipselSubRoutine
:SUB
SET DSTUNDE=%2 && ----------------->der zweite Parameter wird als DSTUNDE gespeichert; Wert ="19"
SET DMINUTE=%3 && ------------------>der dritte Parameter wird als DMINUTE gespeichert; Wert ="53"
:: Jetzt kommt nur Quatsch.............
SET JAHR=%date:~-2% && vom aktuellen, nicht vom Datei-Datum die letzten beiden Zeichen (z.B. "05")
SET MONAT=%date:~3,2% && vom aktuellen, nicht vom Datei-Datum ab Zeichen 3 zwei Zeichen (z.B. "12")
SET TAG=%date:~0,2% && vom aktuellen, nicht vom Datei-Datum ab Beginn zwei Zeichen (z.B. "19")
<s>rem SET STUNDE=%time:~0,2%
rem SET MINUTE=%time:~3,2% </s>
SET NEWFILENAME=%MONAT%%TAG%%DSTUNDE%%DMINUTE%.%JAHR%
:: Somit wird der neue Dateiname aus Tagesdatum (heute) und der Datei-Uhrzeit zusammengemanscht *kopfschüttel*
ren "D:\DATEN\Test" "%NEWFILENAME%"
::???????hatten wir nicht den Namen "test" in einer Variablen %FileName%????
del "D:\DATEN\temp.dat"
--------SchnipselSubRoutine
.... vom inhaltlichen Schwachsinn abgesehen: works as designed, wie wir Biber sagen..*fg

HTH Biber
P.S. Im Bereich "Batch & Shell" gibt es auch ein Tutorial zum Thema "Datums- und Zeitvariablen im Batch" und auch ein paar Batch-Grundlagen.
Bitte warten ..
Mitglied: mkdeluxe
20.12.2005 um 08:13 Uhr
Hallo drop_ch und Biber,

vielen lieben Dank für die Erklärung!!! Wenigstens weiß ich jetzt WAS da passiert, jetzt muss ich nur noch rausfinden warum... Aber das müssen mir die entsprechenden Leute mal schön selbst erklären!!!

>...vom inhaltlichen Schwachsinn abgesehen:...

Danke, das wollte ich hören!

Ihr habt mir wirklich sehr geholfen!!!
THX mkdeluxe
Bitte warten ..
Mitglied: Biber
LÖSUNG 20.12.2005, aktualisiert 19.02.2015
Na, mkdeluxe,

dann poste doch jetzt bitte die kleine Anekdote, die sich hinter Deiner Frage bzw. hinter diesem Praktikanten-Schnipsel verbirgt... neugierig bin ich ja auch.. und sieht so aus, als hättest Du da auch noch eine kleine Pointe auf Lager...

Grüße Biber
Bitte warten ..
Mitglied: mkdeluxe
22.12.2005 um 12:43 Uhr
Hallo Biber,

habe die Antwort gerade erst gesehen...

Unser Admin sagt er braucht das aktuelle Datum weil er ja wissen muss wann die Datei umgestellt wurde. Er konnte mir jedoch nicht so genau erklären, wozu die Uhrzeit der Originaldatei dann notwendig ist. Und warum das aktuelle Datum nötig ist wusste er eigentlich auch nicht, denn eigentlich wäre das Erstellungsdatum ja wesentlich wichtiger. Er hat das jedoch nicht selbst geschrieben, und der Verfasser arbeitet inzwischen nicht mehr hier... Warum nur...???

Grüße mkdeluxe
Bitte warten ..
Mitglied: Biber
LÖSUNG 22.12.2005, aktualisiert 19.02.2015
*lacht*
Danke, mkdeluxe,

dachte mir schon so etwas ähnliches..

Ich denke, nach den ausführlichen Erläuterungen könntest Du den Schnipsel oben auch geradebiegen- im Moment ist es ja nur Unsinn, was der macht. Aber im Bereich "Batch & Shell" findest Du auch schnell besser gelöste Beispiele zum Thema Logdatei mit Datum etc. Oder in den Tutorials.

IMHO gilt aber auch für Batchdateien (auch wenn die meisten Batch ja nicht als Programmier-Werkzeug ernstnehmen):
Kommentare im Code und Dokumentation müssen sein.
Und das fand und finde ich das Schlimmste an dem von Dir geposteten Beispiel - viel schlimmer als handwerkliche Schnitzer und Schmunzelbugs.
Immerhin ist das Dingens ja in produktive innerbetriebliche Abläufe eingebunden.

Platz genug ist in jeder *.bat-Datei für Kommentare - selbst ein einzeiliger Batch belegt heutzutage 16.364 Byte auf der Platte.. also: was soll der Geiz?

Vielen Dank für die Rückmeldung
Biber
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Brauche hilf bei einer batch Datei
gelöst Frage von PilllllleBatch & Shell7 Kommentare

hallo, ich versuche mit Hilfe von einer batch- Datei eine bestimmt Zeile aus einer txt- Datei in eine neue ...

Batch & Shell
Batchdatei: Variablen-Wertezuweisung
gelöst Frage von donnyS73lbBatch & Shell2 Kommentare

Hallole, eine Anfängerfrage: Was mache ich hier falsch? echo %variable1% liefert das richtige Ergebnis, denn variable1 hat einen gültigen ...

Windows 10
Aufgabenplanung und Batchdatei
gelöst Frage von supertuxWindows 105 Kommentare

Hallo zusammen, ich habe mir eine Batch erstellt, diese setzt bestimmt User-Einstellung am PC zurück. Diese Batch habe ich ...

Batch & Shell
Problem mit Batchdatei
Frage von achkleinBatch & Shell3 Kommentare

Hallo, ich habe für eine Bekannte eine kleine Batchdatei geschrieben, die automatisch alte Nachsendeaufträge im Download-Ordner löschen soll. Allerdings ...

Neue Wissensbeiträge
Internet

Kommentar: Bundesregierung erwägt Ausschluss von Huawei im 5G-Netz - Unsere Presse wird immer sensationsgieriger

Information von Frank vor 4 StundenInternet2 Kommentare

Hier mal wieder ein schönes Beispiel für fehlgeleiteten Journalismus und Politik zugleich. Da werden aus Gerüchten plötzlich Fakten, da ...

Windows 10

Netzwerk-Bug in allen Windows 10-Versionen durch Januar 2019-Updates

Information von kgborn vor 8 StundenWindows 101 Kommentar

Nur ein kurzer Hinweis für Admins, die Windows 10-Clients im Portfolio haben. Mit den Updates vom 8. Januar 2019 ...

Windows 10

Windows 10 V1809: Rollout ist gestartet - kommt per Windows Update

Information von kgborn vor 1 TagWindows 102 Kommentare

Eine kurze Information für die Admins, die Windows 10 im Programm haben. Microsoft hat die letzte Baustelle (die Inkompatibilität ...

Sicherheit

Heise Beitrag Passwort-Sammlung mit 773 Millionen Online-Konten im Netz aufgetaucht

Information von Penny.Cilin vor 1 TagSicherheit6 Kommentare

Auf Heise Online ist folgender Beitrag veröffentlicht worden: Heise Beitrag passwörter geleakt Ich bin mir jetzt nicht ganz sicher, ...

Heiß diskutierte Inhalte
Switche und Hubs
Medienkonverter mit 12 oder 24 Ports gesucht
Frage von wmuellerSwitche und Hubs24 Kommentare

Guten Morgen, ich bin auf der Suche nach einem größeren Medienkonverter, der "stumpf" 1:1 die Ports auf über ein ...

Windows Server
Uhren gehen immer wieder falsch
Frage von killtecWindows Server23 Kommentare

Hallo, ich habe folgende Konstellation: 1. Physischer DC Div. Virtuelle DC's auf Hyper-V Servern Die Hyper-V-Server, der Physische DC ...

Batch & Shell
Mit findstr batch doppelte zeilen einer txt löschen
Frage von Burningx2Batch & Shell22 Kommentare

Hi Vor einer weile habe ich im netzt einen windows shell befehl gefunden mit welchem man über die konsole ...

Verschlüsselung & Zertifikate
Netzwerkfreigabe Verschlüsselung
Frage von grill-itVerschlüsselung & Zertifikate20 Kommentare

Moin zusammen, sicher nutzen hier die ein oder anderen ein Produkt zur Verschlüsselung von Netzwerkfreigaben/-laufwerken auf denen hochsensible Daten ...