yakazaa
Goto Top

Mit Batch Verzeichnisse zählen und in Variable speichern

Hallo zusammen,

erstelle gerade -nein, das ist mein voller Ernst - eine Kundenverwaltung mit BATCH.
Der einzige Grund dafür ist eigentlich, dass ich mich bald mit dem RIS Server beschäftigen muss und ich es deshlab für eine gute Übung halte.

Außerdem habe ich mich gerade selbstständig gemacht...
Ach was red ich hier noch blöd rum:

Ich möchte nun meinen Kunden (deren Daten ich in einzelnen Verzeichnissen sammel) mit einer eindeutigen ID versehen.

Verzeichisstruktur:

.\BATCH FILE\Kundendaten\ID_Kundenachname.Kundenvorname\Datensatz.txt

Um dies zu realisieren habe ich mir überlegt, den Ordner Kundendaten zu durchsuchen und dabei soll mir BATCH die Verzeichnisse zählen.
Dieser Wert soll dann um 1 erhöht werden und fortan vor dem erstellten Kundenordner erscheinen.

Blöd erklärt, ich geb euch mal nen Beispiel:

0 Verzeichnisse da -> Wert=1
Neukunde wird angelegt mit dem Ordner 001_Nachname.Vorname

10 Verzeichnisse da -> Wert=11
Neukunde wird angelegt mit dem Ordner 011_Nachname.Vorname

Ich habe von der gesamten Geschichte eigentlich auch schon alles zusammen, bis auf den Zählmechanismus...
Da hoffe ich nun auf eure Hilfe...

Content-Key: 100587

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

Printed on: April 18, 2024 at 00:04 o'clock

Member: bastla
bastla Oct 30, 2008 at 09:23:54 (UTC)
Goto Top
Hallo yakazaa!

Zählen musst Du eigentlich nicht - es sollte ja genügen, die bislang höchste KNr zu finden und um 1 zu erhöhen:
@echo off & setlocal
set KNr=1000
for /f "delims=_" %%i in ('dir /b /ad /on "BATCH FILE\Kundendaten\0*_*" 2^>nul') do set "KNr=1%%i"  
set /a KNr+=1
echo Naechste Kundennummer: %KNr:~-3%
Grüße
bastla

[Edit]
@Biber: Wenn Du auch so "kundenorientiert" bist und die Anforderung wörtlich nimmst - ich war da ja weniger "Rechtsüberholer", als eher "Verfahrensabkürzer" (was, bei genauerer Überlegung, aber etwas widersprüchlich klingt: Wenn man/frau sich verfährt, kommt ja eher selten eine Abkürzung raus ...)
Auf jeden Fall: Grüße zurück ... face-smile
[/Edit]
Member: Biber
Biber Oct 30, 2008 at 09:28:14 (UTC)
Goto Top
Moin yakazaa,

der Zählmechanismus könnte skizziert so aussehen (Demo am CMD-Prompt):
>(set cnt=1001 & @for /d %i in (D:\kunden\*) do @set /a "cnt+=1">nul) & @echo set nextdir=!cnt:~-3!
set nextdir=041

Mimik:
  • Anfangswert "cnt" wird mit 1001 definiert
  • mit FOR/D werden alle Unterordner im Verzeichnis D:\Kunden durchgeeiert (im Beispiel 40 vorhandene Ordner)
  • je "gezählter" Ordner wird mit "set /a cnt+1" der Wert 1001 um 1 erhöht-->Ergebnis des großen geklammerten Ausdrucks=1041
  • von 1041 die letzten 3 Stellen mit "set nextdir=!cnt:~-3!" ermitteln
  • bzw. ohne meine Voreinstellung "Setlocal EnableDelayedExpansion" kann das auch in eine neue Zeile als "Set nextDir=%cnt:~-3%
  • Ergebnis so oder so bei 40 vorhandenen Ordnern: %nextDir%=041..... as should do.

Grüße
Biber

P.S. Hast Du denn auch einen Plan, wie Du Kunden(ordner) berücksichtigst, die mal gelöscht werden?? face-wink
Wenn Kunde(nordner) "037_AngieM" gelöscht wird, dann reduziert das doch die Anzahl der Ordner und auch die nächste freie Ordner-Nummer.
[Edit] P.P.S. Biber grüßt alle Rechtsüberholer! *winkz* [/Edit]
Member: yakazaa
yakazaa Oct 30, 2008 at 09:39:41 (UTC)
Goto Top
Hallo bastla,

Danke für deine schnelle Hilfe - wie immer !

Soweit habe ich dein Skript schon eingebaut und es klappt, wie erwartet, 1A !
Naja, sagen wir mal 1B face-smile
Wieso sind denn meine IDs jetzt 001, 002 usw ?
Ist eigentlich nicht schlimm, aber die Frage ist was beim 1000sten Kunden passiert... (Ich weiß´, ist utopisch...)

Danke schonmal trotzdem !
Member: yakazaa
yakazaa Oct 30, 2008 at 09:42:17 (UTC)
Goto Top
Hallo Biber !

Sorry, aber bastla war leider schneller face-wink

Was deinen Einwand mit dem löschen angeht:
Darüber hatte ich mir tatsächlich noch keine Gedanken gemacht...
In bastla's Methode sollte das allerdings nciht weiter stören, denn er sucht ja immer die höchste vergebene. Ob dazwischen welche frei sind ist ja egal...

Danke dir aber auch nochmal, yaka
Member: yakazaa
yakazaa Oct 30, 2008 at 09:43:17 (UTC)
Goto Top
[Edit]Grüße zurück :-P [/EDIT]
Member: bastla
bastla Oct 30, 2008 at 09:44:10 (UTC)
Goto Top
Hallo yakazaa!

Wieso sind denn meine IDs jetzt 001, 002 usw ?
Was genau meinst du damit? Wenn Du bisher noch keine Ordner nach dem Schema "###_NN.VN" angelegt hattest, beginnt die Zählung natürlich bei 1 ...

... die Frage ist was beim 1000sten Kunden passiert...
Die Verwendung von 3 Stellen war doch Deine (pessimistische face-wink) Vorgabe ...

... lässt sich aber leicht anpassen: Anstelle von 1000 einfach 10000 und statt -3 eben -4 verwenden ...

Grüße
bastla
Member: yakazaa
yakazaa Oct 30, 2008 at 09:49:42 (UTC)
Goto Top
Danke... Bin noch nicht so ganz fit: krank geschrieben...

Mal was anderes:
Ich muss ja hinterher, wenn ich z.B.: DAtensätze bearbeiten will,
die Dinger auch durchsuchen können...

Hier hab ich mir die Verschiedenen Trennzeichen überlegt :
Nach der ID ein Unterstrich
Nach de Vornamen ein Punkt

Kannst du mir evtl. an einem Beispiel erklären wie ich das nun machen muss ?

Beispiel: Suche nach ID.

Diese ist ja immer 4-stellig

Also könnte ich jetzt entweder sagen:
Durchsuche jeden Dateinamen und schmeiß alles nach der 4ten Stelle weg, oder halt eben alles nach und incl. dem Unterstrich.
Member: bastla
bastla Oct 30, 2008 at 10:01:55 (UTC)
Goto Top
Hallo yakazaa!

Ich muss ja hinterher, wenn ich z.B.: DAtensätze bearbeiten will,
die Dinger auch durchsuchen können...
Wie sollen denn Deine "Datensätze" denn aussehen? Bis jetzt war ja nur von Ordnern die Rede ...

Grundsätzlich kannst Du aber mit
dir /s /b "####_*.*"
nach einer ID suchen (und erhältst alle nach diesem Schema benannten Ordner und - ansonsten "/ad" oder "/a-d" hinzufügen - Dateien als Ergebnis), oder mit
dir /s /b "*_Nachname.*.*"
nach dem Namen ...

Grüße
bastla
Member: yakazaa
yakazaa Oct 30, 2008 at 10:17:44 (UTC)
Goto Top
Ich erzähl hier wieder nur die Häfte....

OK, nochmal meine Schuld:

Ich habe gerade mal einen Datensatz als Demo erzeugt:

In der TXT Datei steht drin:

Nachname
Vorname
Straáe
Hausnummer
PLZ
Ort
eMail
Festnetz
Mobil
gesch„ftl

Halt eben für alles eine Zeile.
Erzeugt wird Sie durch mit SET /P gefüllte Variablen die ich anschließend dann mittes ECHO %VAR%>>Datensatz.txt
wegschreibe.

Am einfachsten ist es dann warscheinlich,
wenn ich das Ergebnis von

dir /s /b "%ID%_*.*"

also sprich den Ordnernamen in einer Variable speicher.
Dann kann ich ja hinterher .\%ORDNER%\Datensatz.txt mit nem Editor öffnen lassen und die Daten ggf. abändern...

Oder hab ich da wo wieder an irgendetwas nicht gedacht ?! face-wink
Member: yakazaa
yakazaa Oct 30, 2008 at 10:33:41 (UTC)
Goto Top
Also scheinbar hab ich was vergessen, denn wenn ich :

@echo ON
CD ".\Kundendaten\"
dir /s /b "0001_*.*" > %ORDNER%
ECHO %ORDNER%
pause

testweise ausführe bekomme ich immer einen Syntaxfehler genannt...
Member: yakazaa
yakazaa Oct 30, 2008 at 11:07:10 (UTC)
Goto Top
Zitat von @yakazaa:

@echo ON
CD ".\Kundendaten\"
dir /s /b "0001_*.*" > %ORDNER%
ECHO %ORDNER%
pause

Nach ein bischen googeln habe ich noch folgende Variante probiert:

@echo ON
dir /s /b "0001_*.*" > erg.tmp
set ORDNER = < erg.tmp
ECHO %ORDNER%
pause

Leider kommt dann als Ausgabe:

D:\Kundenverwaltung\module\kunden>dir /s /b "0001_*.*" 1>erg.tmp
D:\Kundenverwaltung\module\kunden>set ORDNER = 0<erg.tmp
D:\Kundenverwaltung\module\kunden>ECHO
ECHO ist eingeschaltet (ON).

Wenn ich aber den Befehl:

dir /s /b "0001_*.*"

So eingebe bekomme ich als Ausgabe:

D:\Kundenverwaltung\module\kunden\Kundendaten\0001_Tuennerhoff.Dominik

Genau das, steht auch in der o.g. erg.tmp Datei drin.
Nur, will er das nicht in die Variable Ordner speichern...

Irgendeine Idee ?
Member: yakazaa
yakazaa Oct 30, 2008 at 11:37:53 (UTC)
Goto Top
Auch wenn ich hier mitlerweile Selbstgespräche zu führen scheine: :-P

:SUCHE_NAME
dir /s /b *%NACHNAME%.%VORNAME%> test.tmp
FOR /f %%f IN (test.tmp) DO SET ORDNER=%%f
GOTO SUCHE_WEITER

:SUCHE_ID
dir /s /b "%ID%_*.*"> test.tmp
FOR /f %%f IN (test.tmp) DO SET ORDNER=%%f
GOTO SUCHE_WEITER

:SUCHE_WEITER
DEL test.tmp
NOTEPAD "%ORDNER%\Datensatz.txt"

Das läuft soweit auch, zumindest wird der Ordnername jetzt in der Variable %ORDNER% gespeichert, es gibt nur 1 Problem:

Wenn ich die Datei nun aufrufen möchte, also mit:

NOTEPAD "%ORDNER%\Datensatz.txt"

beinhaltet %ORDNER% scheinbar den Pfad (is ja auch korrekt) und ein Leerzeichen. Naja, und dann findet er den Pfad natürlich nicht..

Ne Idee wieso er das Leerzeichen da mit rein nimmt oder wie ich ihm sagen kann, dass er das letzte Zeichen der Variable %ORDNER% wegschmeißen soll ?
Member: Biber
Biber Oct 30, 2008 at 11:46:12 (UTC)
Goto Top
Moin yakazaa,

Ne Idee wieso er das Leerzeichen da mit rein nimmt
Weil Batche doof wie Brot sind und alles machen, was Du ihnen sagst und Du ein abschließendes Leerzeichen hier hast.
...
:Suche_ID
dir /s /b "%ID%_*.*"> test.tmp
FOR /f %%f IN (test.tmp) DO SET ORDNER=%%f_    <----hier is' ein trailing blank

Vermeidung:
...
:Suche_ID
FOR /f %%f IN ('dir /s /b "%ID%_*.*"') DO SET "ORDNER=%%f"

Grüße
Biber
Member: yakazaa
yakazaa Oct 30, 2008 at 12:25:42 (UTC)
Goto Top
Bedankt !
Also eigentlich Ich = doof, nicht Batch !

Ganz doof dann aber doch nun nicht,
hab mir mit:

SET ORDNER_KORR=%ORDNER:~0,-1%

was zurechtgedocktert face-wink
Danke trotzdem nochmal, werds später ändern...

Jetzt erstmal ein bischen testen.
Kundenverwaltung habe ich schonmal,

Jetzt kommt der ganze Mist mit Rechnungen erstellen und so face-sad

Mal schaun wie gut mein Konzept dabei war, jede Kundeninfo in eine Zeile zu schreiben...