forseti2003
Goto Top

Batch-Scripting

Grüße an Alle,

hab jetzt die letzten 3-5 Stunden damit verbracht mittels Google und Co.
mir Hilfen und Beispiel-Code für eine (vermutlich zweigeteilte) Batchdatei zu holen, bin dabei aber noch nicht ganz fündig geworden.

Vielleicht kann mir aber jemand bei dem Problem helfen, denke sogar das es recht simpel ist, aber ich mal wieder den Wald vor lauter Bäumen nicht sehe.

Folgendes:
Wir erstellen mit Hilfe eines Multifunktionsgeräts TIFF-Dateien und legen diese auf einem FTP-Server ab. Soweit so gut, nur hat der Drucker den Nachteil, das er seinen Profilnamen als Ordnername nutzt und diesen hochnummeriert. Die Dokumente darin lauten dann jeweils 00001.tiff 00002.tiff etc.

Wir haben den Drucker nun so umprogrammiert, das er bei dem SCAN-Vorgang einen Wert abfrägt, denn wir eintragen können.

Diesen schreibt er aber leider nur in eine METADATEI (XST) hinein und kann diesen Wert nicht als Ordernnamen nutzen.

So sollte es aussehen:
Die Batchdatei öffnet über das Hauptverzeichnis des geplanten Archives die Unterordner und sucht dort nach der XST.Datei.
Dieser entnimmt er einen String (also eine komplette Zeile) die er dann in zwei Teilbereiche zerlegt, nämlich Alt und Neu.
Nun würde man mit diesen beiden Werten erstmal simpel den REN Befehl durchführen.

So sieht man bisheriges Ergebnis aus:

echo off
@for /f "delims=" %%f IN ('findstr /s "MetaDataValue" Sinsheim*.XST') DO (  
SET zeile=%%f 
echo %zeile:~16,11% %zeile:~62,7%
)

Die erste Zeile schaltet erstmal alles störende auf dem Bildschirm aus, die zweite Zeile sucht dann nach der XST Datei und übergibt die gesuchte Zeile für die weitere Verarbeitung an den SET Befehl, der daraus eine Variable zeile generiert, die mittels Echo derzeit erstmal in die zwei Teilbereiche aufgedröselt wird.

Problem derzeit ist aber, das sich dabei der Wert in Zeile nicht ändert und auf dem letzten Wert in der Liste stehen bleibt und dies dann für alle anderen Dateien auch so übergibt.
Habe schonmal mit OPtion /V an der CMD und !zeile! versucht das Ergebnis zu verbessern derzeit aber noch ohne Ergebnis. Habe ich da einen Denkfehler in meiner FOR Schleife oder an was liegt es?

mfg

Forseti2003

Content-ID: 126685

Url: https://administrator.de/contentid/126685

Ausgedruckt am: 25.11.2024 um 12:11 Uhr

bastla
bastla 08.10.2009 um 17:19:01 Uhr
Goto Top
Hallo Forseti2003!

Du wirst wegen des "/s" bei "findstr" nicht nur die gesuchte Zeile, sondern vorneweg auch noch deren Pfad/Dateinamen erhalten - ansonsten wäre der Ansatz mit "!Zeile!" schon richtig, also etwa bei Suche nur in den .XST-Dateien des aktuellen Ordners:
@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%f in ('findstr "MetaDataValue" Sinsheim*.XST') do (  
    set "Zeile=%%f"  
    echo !Zeile:~16,11! !Zeile:~62,7!
)
Wenn die Datei tatsächlich auch in Unterordnern gesucht werden muss, eher so:
@echo off & setlocal enabledelayedexpansion 
for /f "tokens=1* delims=:" %%e in ('findstr /s "MetaDataValue" Sinsheim*.XST') do (  
    set "Zeile=%%f"  
    echo !Zeile:~16,11! !Zeile:~62,7!
)

Grüße
bastla
Forseti2003
Forseti2003 08.10.2009 um 18:21:26 Uhr
Goto Top
Hallo bastla,

okay, ohne Tippfehler läuft das Skript besser face-wink ...
Leider habe ich jetzt nur den Ordnernamen stehen und nicht mehr die Tournummern, die ich aus dem zweiten Wert extrahieren müßte.
Scheinbar greift nun die Variable ins Leere.

Hab die Formel nun mal umgestellt und erhalte so die Ergebnisse die ich erstmal brauche:

@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%f in ('findstr /s "MetaDataValue" Sinsheim*.XST') do (  
set "Zeile=%%f"  
echo !Zeile:~16,11! !Zeile:~62,7!
)

Dann muss ich nun mit Teil 2 Anfangen, übergabe der Parameter für den REN Befehl um die Verzeichnisse umzubenennen.

Bräuchte aber eine Prüfroutine die nochmal schaut ob

A) Der Ordner bereits vorhanden ist (dann sollte er lieber den Inhalt des anderen in den kopieren und die DAteien neu benennen)
B) Wenn die Tournummer keinen Zifferwert hat, überspringen.

Eigentlich könnte man noch mehr miteinbauen, aber ab da wäre ich schon froh face-wink
bastla
bastla 08.10.2009 um 18:48:10 Uhr
Goto Top
Hallo Forseti2003!

Kannst Du bitte etwas konkreter werden und eine Beispielzeile posten - die "Tournummer" etwa hattest Du vorher nicht erwähnt und jetzt nicht erklärt ...
In der Testphase ist es übrigens sinnvoll, anstelle von "echo off" ein "echo on" zu verwenden - so siehst Du alle Befehle, bevor sie ausgeführt werden (aber bereits mit Werten anstelle von Variablen) ...

Grüße
bastla
Biber
Biber 08.10.2009 um 18:50:37 Uhr
Goto Top
Moin Forseti2003,

ich hoffe, du kannst noch die Augen aufhalten - laut deinem Eröffnungsbeitrag ("hab jetzt die letzten 3-5 Stunden damit verbracht mittels Google.." ) musst du ja schon seit 04h morgens mit dem Zerbröseln dieser .XST-Dateien unterwegs sein...*gg

Damit du heute noch irgendwann Feierabend machen kannst, würde ich als nächste Schritte vorschlagen:

Ändere den letzten Schnipselstand
@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%f in ('findstr /s "MetaDataValue" Sinsheim*.XST') do (  
set "Zeile=%%f"  
echo !Zeile:~16,11! !Zeile:~62,7!
)

in diesen hier (eigentlich keine inhaltliche Änderung)
@echo off & setlocal
for /f "delims=" %%f in (  
     'findstr /s "MetaDataValue" Sinsheim*.XST'  
     ) do set  "Zeile=%%f" &  Call :ProcessATour  
goto :eof
~~~~
hier Raum für Notizen

~~~
:ProcessATour  in %Zeile% steht eine ganze Zeile mit "...MetaDataValue..." 
Set  "thisFolder=%Zeile:~16,11%"  
Set "thisTournr=%Zeile:~62,7%"  
REM ---- in dieser Zeile können wir Folder/Tournr-Check nachschieben ---
echo ThisFolder:[%thisFolder%] ThisTourNr:[%ThisTournr%]
goto :eof

Wenn Du vielleicht mal diesen Schnipsel testest und uns drei, vier Beispielausgabezeilen postest,
dann wissen wir, was zu erwarten ist.

Danke
Biber
Forseti2003
Forseti2003 08.10.2009 um 18:54:44 Uhr
Goto Top
Hallo bastla,

hm, das liegt wohl daran, das ich die ganze Zeit an der Sache hänge und wohl die Begriffe schon natürlich verwende so als wenn damit jeder was anzufangen weiss.

Also konkreter:

Der Wert bei Zeile 04, die ~16,11 ist der Ordnername, wie er derzeit im System hinterlegt ist.
Der Wert bei 62,7 ist die 7-stellige Tournummer.

Nun ist es faktisch so, das wir die Dokumente verscannen aber dabei mehrere Ordner erzeugen, die die gleiche Tournummer später beinhaltet. Derzeit helfe ich mir einfach so, das ich der Zeile 62,7 einfach einen Buchstaben pro Durchlauf anhänge, da folgendes Problem noch vorhanden ist:

Innerhalb des Ordners werden alle Dokumente 0001 aufwärts benannt. Ein neuer Ordner der aber die gleiche Tournummer betreffen würde, fängt auch wieder mit 0001 an. Also kann ich nicht einfach von einem in den anderen kopieren, da ich damit die alt-Daten überschreibe.

Ich müßte also nun weiter hergehen und diese Ordner in die Ursprungsordner kopieren, dabei aber den Dateinamen abändern, damit er nicht kollidiert.

Nur hier hören meine Script-Kenntnisse leider auf.

Rein Schematisch ersetze ich echo durch REN, hiervor müßte aber wohl eine IF Schleife kommen die überprüft, ob der nun anzulegende Ordner bereits vorhanden ist, wenn ja dann kopiert er die Dateien und benennt diese im Zielordner um, wenn nein, benennt er einfach den Ordner um.

Hoffe das ich das nun richtig und ausführlich genug geschildert habe.

Grüße

Forseti
Forseti2003
Forseti2003 08.10.2009 um 19:03:30 Uhr
Goto Top
Hallo Biber,

das mit der Zeit kommt gut hin,..leider ... face-sad

Hab die Datei mal durchlaufen lassen Ergebnis sieht so aus:

ThisFolder:[0002.XST: ] ThisTourNr:[;]
ThisFolder:[0004.XST: ] ThisTourNr:[;]
ThisFolder:[Sinsheim.XS ] ThisTourNr:[1724";]
ThisFolder:[Sinsheim012 ] ThisTourNr:[ strin]
ThisFolder:[Sinsheim012 ] ThisTourNr:[etaData]
ThisFolder:[Sinsheim012 ] ThisTourNr:[T: ]
ThisFolder:[Sinsheim012 ] ThisTourNr:[T: ]
ThisFolder:[Sinsheim001 ] ThisTourNr:[6011724]
ThisFolder:[Sinsheim004 ] ThisTourNr:[etaData]
ThisFolder:[Sinsheim009 ] ThisTourNr:[6011717]


Also das Ergebnis sieht erstmal gut aus, über die teilweise fehlerhaften Angaben braucht man sich nicht stören, die kommen daher, das ein Mitarbeiter es gut meinte und die Ordner die doppelte Tournummern hatten, in einen Ordner als Unterverzeichnis reingezogen hat, was aber später dann ja nicht mehr passieren würde.
Biber
Biber 08.10.2009 um 19:11:54 Uhr
Goto Top
Moin Forseti2003,

danke für die schnelle Antwort.

Sicherheitshalber die Frage:
Ist es wirklich vertretbar/sinnvoll, den Inhalt der "MetaDataValue-Zeile" stumpf nach Substring(Zeile, von, bis) zu teilen?
Wäre es nicht benutzerfreundlicher/prozessgerechter, tatsächlich als "%ThisFolder%" das rauszuflöhen, was ja offensichtlich (im IT-Sinne) "immer" mit "Sinsheim" anfängt in der Länge 11 und als %thisTournr% das, was vermutlich nach "MetaDataValue" und "T:" in der Länge 7?

Ist aber eher ein Nebenschauplatz...

Grüße
Biber
Forseti2003
Forseti2003 08.10.2009 um 19:47:21 Uhr
Goto Top
Hallo Biber,

nunja, im IT-Sinne ist es garantiert nicht die eleganteste Lösung, das ist wohl wahr. Der Aufbau der XST Datei ist auch recht simpel gehalten, aber die Frage ist, wie kann ich die Werte besser abgreifen?

Die drei oberen Folder im Beispielauszug sind erstmal verunglückte Ordner, die auf besagten Mitarbeiter herrühren, im späteren Produktiveinsatz, wäre das Problem eigentlich ja nicht mehr vorhanden.

So dass sich nur das Problem stellen würde, weil der Scanner den allerersten Ordner immer Sinsheim.XSM nennt, alle folgenden dann aber Sinsheim001.XSM etc. ...

Daher wäre das filtern nach den tatsächlichen Werten sinnvoller, aber wie kann ich einen String "sauber" auslesen?

Bei der Tournummer sehe ich da noch eine simple Möglichkeit das Feld lautet

string MetaDataValue = "6123456";

Diese Zeile ist eigentlich absolut konstant und verändert sich so nie.

Der Ordername ist auch existent und wird in einer ähnlichen Zeile mit übergeben, also auch hier im Aufbau dann:

string ObjetDataValue = "Sinsheim001";

Man müßte also nur das XSM dahinter setzen, was aber wohl ein kleinerer Aufwand wäre.

Schwieriger wird es aber dann wenn es darum geht Ordner in bereits bestehende Ordner zu kopieren und die Dateien darunter neu zu benennen. Wobei der Dateiname wurscht ist, schöner wäre es natürlich wenn alle Dokumente dann wie der Ordner heißen würde also:
Ordner 6012345:
Datei 6012345-1.tiff
Datei 6012345-2.tiff
etc. pp.

Natürlich könnte ich auch noch über den Drucker einen 2. Wert mitgeben, nämlich Dokumentenart und damit die Dateien dann später benennen, aber soviel Aufwand ist erstmal gar nicht nötig.

Grüße

Forseti
Biber
Biber 08.10.2009 um 20:15:59 Uhr
Goto Top
Moin Forseti2003,

in diesem fall würde ich in der Tat empfehlen, diese Zeile(n) nicht mit Abzählerei [SubStr(.., , .)] zu zerlegen, sondern gemäß ihrer gegebenen Struktur, so wie ich glaube verstanden zu haben.

  • wenn die Zeile 'string MetaDataValue = "6123456";' immer als Einzelzeile erwartet wird, dann bekämst Du diesen Wert aus jeder Simsheimxxxx.XST-Datei mit:
[Test am CMD-Prompt; auf deinen Pfad ändern]
(=20:04:48  D:\temp=)
for /f "tokens=2 delims==;" %i in ('findstr "MetaDataValue" e:\schnipsel\sinshei*.xst') do @echo Tournr=%~i  
Tournr= "6123456"  

Den Folder- bzw bei dir das Obje[c]tDataValue mit
for /f "tokens=2 delims==;" %i in ('findstr "tDataValue" e:\schnipsel\sinshei*.xst') do @echo Folder=%~i  
Folder= "Sinsheim001"  

Das wäre doch ausbaufähig, oder?

A propos aus- bzw abbauen... ich finde, wir geben dir mal den Rest des Nachmittags frei und machen morgen weiter.

Grüße
Biber
Forseti2003
Forseti2003 09.10.2009 um 16:52:24 Uhr
Goto Top
Hallo Biber,

Danke für die Schnipsel, nach ein wenig Augenpflege und eine Mütze voller Schlaf, sieht die Welt ja wieder mal ganz anders aus.

Der Durchlauf der Schnipsel ist zwar erstmal soweit in Ordnung, jedoch liegt ein anderer Fehler nun in der Sache selbst. Derzeit nutze ich nur einen ORdner auf dem FTP-Server, dieser lautet einfachheitshalber ARCHIV.

In Archiv werden die Ordner und TIFF-Dokumente brav durch den Scanner abgelegt. Jedoch hat dieser Vorgang einen Haken. Der Scanner prüft vorab, welche Dateien da drin liegen und liegt nun keine Sinsheim004 mehr darin, wird er das nächste Dokument so wieder benennen.

Scheinbar alles in ORdnung, aber wenn er das durchläuft, findet er zwei Ordner Sinsheim004, den alten und neuen. Der alte Ordner hat aber nun als Beispiel die Tournummer 601111 und würde somit ja bereits 601111 wirklich heißen, der neue Ordner hat die Tournummer 601112, aber durch den vorherigen Befehl findet ja das Skript einen Ordner Sinsheim004 (den für Tour 11112) und benennt diesen, wenn er könnte auf 601111 um.

Dies geht nun zwar Gottseidank nicht mehr, aber es würde einen weiteren händischen Eingriff erfordern.

Also müßte man wohl in die Routine ein IF packen, damit er nur Ordner überhaupt prüft, die mit Sinsheim afangen. Damit müßte man dann aber auch eine Schleife programmieren, die sich variabel nach der Anzahl der gezählten Ordner mit Sinsheim aufbaut. Den der /s Trigger bei Findstr wird dann da wohl ja nicht mehr greifen können, oder kann ich diesem sagen s:\Archiv\Sinsheim*.XSM\Sinsheim*.XST also mit zwei Wildcards versehen? Dann könnte ich mir wenigstens die Routine am Anfang wieder einsparen.

Aber der Teil B des Skripts wird wohl der etwas interessantere werden, damit er zwischen umbenennen und kopieren unterscheiden kann, aber da bin ich ganz ehrlich, hab ich derzeit noch keinen Ansatz der mir hier etwas besseres bieten könnte.

Kann ich übrigens das Datum der Erstellung des Dokuments auslesen? Habe da noch einen Paralellfall, in dem alles als Mehrfach-PDF erstellt wird, diese Datei würde ich gerne einfach in einen Ordner "VERSAND*DATUM*" stecken, das *DATUM* sollte das Erzeugungsdatum sein.

Grüße

Forseti2003
bastla
bastla 09.10.2009 um 17:51:25 Uhr
Goto Top
Hallo Forseti2003!

Um hier doch auch etwas beizutragen: Wenn nur Ordner mit "Sinsheim" im Namen verarbeitet werden sollen, kannst Du die folgende Schleife verwenden:
for /d %%a in ("s:\Archiv\Sinsheim*.XSM") do for /f "tokens=2 delims==;" %%i in ('findstr "MetaDataValue" "%%a\sinshei*.xst"') do echo Tournr=%%~i 
Das Änderungsdatum von Dateien (sollte ja für PDF genügen) könntest Du direkt in einer Schleife etwa so erhalten / verwenden:
for %%i in (*.PDF) do for /f "tokens=1-5 delims=.: " %%a in ("%%~ti%") do echo %%c-%%b-%%a_%%d%%e
Grüße
bastla

[Eidt] Fehlendes Anführungszeichen nach .xst ergänzt [/Edit]
Forseti2003
Forseti2003 09.10.2009 um 20:32:03 Uhr
Goto Top
Hallo bastla,

die obere Schleife werde ich mal noch im Laufe der nächsten Woche testen, der zweite Code-Schnipsel ist ja hoch interessant, das man das so generieren kann, wäre ich nie drauf gekommen.

Leider hat es aber ein "kleines" Problem, ich muss wirklich auf das Erstelldatum abzielen, nicht auf das Änderungsdatum, da dieses sich mit jeder Ansicht auch verändern kann und somit den Ordnernamen sinngemäß verfälscht.

Grüße

Forseti
bastla
bastla 09.10.2009 um 21:15:06 Uhr
Goto Top
Hallo Forseti2003!

Na dann eben doch mit Erstellungsdatum:
for %%i in (*.PDF) do for /f "tokens=1-5 delims=.: " %%a in ('dir /tc "%%i"^|findstr "%%i"') do echo %%c-%%b-%%a_%%d%%e %%i
Grüße
bastla
Forseti2003
Forseti2003 09.10.2009 um 21:46:12 Uhr
Goto Top
Nabend bastla,

nun bin ich sprachlos,....

Dabei fällt mir nun aber langsam ein, wie ich mit all diesen Code-Schnipseln den Teil B lösen könnte.

1) Das Skript untersucht erstmal ob es Ordner findet die auf Sinsheim lauten. Wenn ja springt auf die nächste Schleife, wenn nein, legt er sich schlafen.

2) Bei Ja, prüft er nun ob ein Ordner gleichlautend der Tournummer bereits vorhanden ist, wenn ja kopiert er, wenn nein benennt er um.

Soweit der simple Teil wohl

3) Wenn er kopieren soll, nimmt er nur die TIFF Dateien, benennt diese wie den Ordner und hängt einen Wert dazu, damit alle Dokumente zumindest gleichlautend am Anfang heißen. Bsp.: 601112_1.tiff

4) Nach getaner Arbeit springt er in die Ordner und löscht dort die nicht mehr benötigten XST Dateien einfach der Übersicht wegen.

5) IT-technisch gesehen, wäre es wohl sinnvoll, das er dann auch noch eine Log-Datei erstellt, das man sieht das er was getan hat.

Also Punkt 3 denke ich, wird dann das etwas schwierigere werden oder kann ich mit copy oder xcopy beim kopieren gleich auch den Namen ändern?

Grüße

Forseti
bastla
bastla 09.10.2009 um 21:52:28 Uhr
Goto Top
Hallo Forseti2003!
kann ich mit copy oder xcopy beim kopieren gleich auch den Namen ändern?
Für einzelne Dateien (die nicht inklusive Pfad kopiert werden sollen, sodass also erst die Ordnerstruktur aufgebaut werden müsste) brauchst Du nur "copy" - und ja, Du kannst durch die explizite Angabe des Zieles auch ein Umbenennen durchführen.

Grüße
bastla