mag-lion
Goto Top

Aus einem Verzeichnis bestimmte Inhalte von Dateien extrahieren und sortiert in eine Datei schreiben.

Hallo,

ich komme mit dem Script nicht weiter. Auch die Suche in den Foren brachte letztendlich keinen Erfolg.
Deshalb hoffe ich hier auf Unterstützung.

Folgende Ausgangssituation:
Über ein Loginscript werden je PC und User verbundene Netzlaufwerke
jeweils in eine Datei "n.%computername%(%username%).txt" geschrieben.
Z.B.
Inhalt von n.pc1(user1).txt

26.04.2011
I: \\srv01\share-a
J: \\srv01\share-b
K: \\srv02\share-x
L: \\srv02\share-y

27.04.2011
I: \\srv01\share-a
J: \\srv01\share-b
K: \\srv02\share-x
L: \\srv02\share-y



Inhalt von n.pc2(user1).txt

26.04.2011
K: \\srv01\share-a

27.04.2011
K: \\srv01\share-a



Inhalt von n.pc2(user2).txt

26.04.2011
I: \\srv01\share-a
J: \\srv01\share-b
K: \\srv02\share-x
L: \\srv02\share-y

27.04.2011
I: \\srv01\share-a
J: \\srv01\share-b
K: \\srv02\share-x
L: \\srv02\share-y



Solche gibt es zu Hauf in dem Verzeichnis mit entsprechendem Inhalt.
Wobei sie noch variieren mit gleichen %computername% aber unterschiedlichen
%username%, Inhalt entsprechend ebenfalls.

Ich möchte nun eine Datei erstellen lassen, die evtl. so aussieht bzw. was
ich daraus entnehmen könnte:

_____pc1/user1 #ein User mit seinem PC und verbundenen Laufwerken
I: \\srv01\share-a
J: \\srv01\share-b
K: \\srv02\share-x
L: \\srv02\share-y
_____pc2/user1 #der gleiche User am anderen PC mit falsch verbundenem Laufwerk
K: \\srv01\share-a
_____pc2/user2 #ein anderen User am obigen PC mit richtig verbundenen Laufwerken
I: \\srv01\share-a
J: \\srv01\share-b
K: \\srv02\share-x
L: \\srv02\share-y


Folgendes Script bringt mir noch nicht das gewünschte Ergebnis.

for /f %%i in ('dir /o /b *.txt') do (   
	rem sort %%i /o %%i
	for /f "delims=.() tokens=2,3" %%a in ('echo %%i') do echo _____%%a/%%b >> %~n0.log  
	rem for /f "delims=" %%x in ('sort %%i') do @findstr "%%x" "%~n0.log">nul || @echo %%x >> %~n0.log  
	rem for /f "delims=" %%x in ('sort %%i') do @findstr /C:": \\" "%~n0.log">nul || @echo %%x >> %~n0.log  
	rem findstr /C:": \\" %%i >> %~n0.log  
	echo. >> %~n0.log
)

Wobei Zeile 2 mir die Ausgangsdatei zerschiesst. face-sad
Zeile 3 dient als Überschrift.
4, 5 oder 6 als entsprechende Variante. (ungenügende).

Ich brauch hierbei dringend Hilfe um zum obigen Ergebnis zu kommen. Im "Inhalt" jeder Datei
sind die Angaben mehrfach vorhanden. Ich möchte diese aber nur jeweils einmal haben.


Grüße
mag

Content-Key: 165347

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

Printed on: April 24, 2024 at 04:04 o'clock

Member: bastla
bastla Apr 28, 2011 at 15:28:16 (UTC)
Goto Top
Hallo mag-lion!

Versuch's mal so (nur oberflächlich getestet):
@echo off & setlocal
set "Log=%~n0.log"  
set "TLog=%temp%\%Log%.tmp"  

del "%Log%" 2>nul  
for /f %%i in ('dir /o /b *.txt') do (   
    for /f "delims=.() tokens=2,3" %%a in ("%%i") do >"%TLog%" echo _____%%a/%%b  
    for /f "delims=" %%x in ('findstr /C:": \\" "%%i"') do findstr "%%x" "%TLog%">nul||>>"%TLog%" echo %%x  
    >>"%Log%" sort "%TLog%"  
    >>"%Log%" echo.  
)
del "%TLog%"  
Grüße
bastla
Mitglied: 60730
60730 Apr 28, 2011 at 15:52:49 (UTC)
Goto Top
moin,

ich hätte da eine Idee, aber die "spinn" ich erst weiter - wenn du uns den Grund nennst, warum du das so haben willst.

Diese Datei(en) erzeugst du ursprünglich ~ so?

for /f "tokens=2,3" %a in ('net use^|find ":"') do echo %a;%b  

gruß
Member: mag-lion
mag-lion Apr 29, 2011 at 04:51:11 (UTC)
Goto Top
Guten Morgen,

schön, wenn Profis am (im) Werk sind . face-smile

@bastla
Oberflächlich ist gut. ist perfekt und vielen vielen Dank.

@timobeil
Ja, die Zeile passt.
Hintergrund: Ich möchte die, hier durch mehrfach vorhandene Login-Scripte und manuell
verbundenen Laufwerksbuchstaben reduzieren. Deshalb war der erste Ansatz vor einiger
Zeit: Erst mal sehen, wer sich welche wo verbindet, Auswertung folgt später. Und zwar jetzt.
Dann bin ich mal gespannt auf deine Schlußfolgerung.

Grüße
mag
Member: bastla
bastla Apr 29, 2011 at 06:09:43 (UTC)
Goto Top
Hallo mag-lion!

Freut mich, wenn's soweit passt ... face-smile

Wenn ich, so wie T-Mo es zumindest andeutet, schon bei der Erstellung der Logs ansetzen könnte (und nicht die bereits Vorhandenen verarbeiten muss), würde ich zumindest vollständige Datensätze verwenden - also zusätzlich Rechnername, Username, Datum getrennt (CSV) in jeder Zeile mit ausgeben, weil damit die Nachbearbeitung (Sortierung, Gruppenverarbeitung) vereinfacht wird - und maximal eine Datei je Rechner erstellen ...

Grüße
bastla
Mitglied: 60730
60730 Apr 29, 2011 at 08:01:20 (UTC)
Goto Top
moin,

na da bin ich aber froh, dass ich keinen Aufsatz gemalt habe face-wink

Aber........

  • Kannst du uns noch ein paar Infos geben...

  • habt Ihr Gruppen?
  • wieviele User?
  • überall identische Geräte - bis jetzt ist dein Logfile ja nur mit Netzwerklaufwerken und "I" ist verdächtig nahe an irgendwelchen USB mehrfach Kartenlesern dran.

Abhängig davon, würde ich das so skizzieren:
Zu mehr als einer Skizze werde ich heute wegen Vollem Programm nicht kommen...

  • mit der obigen Skizze ~ so weiterwerkeln...
for /f "tokens=2,3" %a in ('net use^|find ":"') do echo %a;%username%;%computername%;%date%>>%b\map.txt  
edit - nein doch eher so...

back-to-topAch ja, n: gibt es noch nicht.

back-to-top<edit 2>:

nein - weil ich nicht mal eben in allen meinen gemappten Laufwerken eine Datei haben wollte, hab ich das nur mit n: getestet und das hier gutverbergt.
Und wo du die speicherst - ist dir überlassen - ich fand den Ansatz - ohne zu wissen wie Ihr da werkelt - logisch.
Mit einem dir /b /s map.txt und wenigen Servern wäre da ja kein Ding - aber hat der User da nur leserechte - wäre das ein Griff in den gekachelten Raum.

Ich schrub doch - ich hab grad selber ein volles Programm und da Bastla auch im Boot ist - dachte ich - schreibs runter - dann habt ihr beide und ff. was zum diskutieren.

Freut mich aber, das du mitdenkst.
</edit2>
for /f "tokens=2,3" %a in ('net use^|find ":"') do findstr /i /c:"%a;%username%;%computername%;" "%b\map.txt" ||echo %a;%username%;%computername%;%date%>>%b\map.txt  
/edit

Und dann Freigabe für Freigabe durchschauen, statt User für User...

  • Je nachdem ob oder ob Ihr keine Gruppen habt - dann nach der Liste Gruppen anlegen.

(Du ahnst es - dazu kannst du das Logfile benutzen net group /?)

Gruß
Member: mag-lion
mag-lion Apr 29, 2011 at 09:36:16 (UTC)
Goto Top
Hallo TimoBeil,

... Aufsatz malen... face-surprise Wie sieht der denn aus? face-wink
fehlt noch: Namen tanzen... 0face-smile

  • Gruppen - meinst du AD-Gruppen, dann ja und zwar ne ganze Menge.
  • User - so um die 400.
  • Geräte - verschiedene. Und wegen der LW-Buchstaben geht es teilweise bis F: zurück - deswegen der Versuch Ordnung zu schaffen.

Dein Ansatz hat imho den Nachteil für mich, dass dieser die map.txt in die jeweilige Freigabe schreibt.
Da ich aber welche habe, die manuell vom User selbst sonstwohin gemappt wurden, würde ich diese dann nicht
finden. Ach ja, n: gibt es noch nicht. Also wäre hier auch das Problem welche LW-Buchstaben werden verwendet?
Also n: raus lassen und alles in eine "Sammel"map.txt zentral. Von Anfang an - JA.

Vielen Dank für die Mühe


Grüße
mag
Member: mag-lion
mag-lion Apr 29, 2011 at 09:56:29 (UTC)
Goto Top
Ups... mitten drin editiert. Hatte ich nicht gleich gesehen.

Deine Lösung heb ich mir auf, falls ich noch mal so ein Chaos vorfinde.
Also jetzt nicht weiter stressen lassen und ich markiere den Beitrag als gelöst.

Nochmals danke.

Gruß
mag
Mitglied: 60730
60730 Apr 29, 2011 at 10:20:11 (UTC)
Goto Top
Zitat von @mag-lion:
Hallo TimoBeil,

... Aufsatz malen... face-surprise Wie sieht der denn aus? face-wink

Besser als eine geschriebene Skizze face-wink

Nur damit du es mitbekommst - ich hab da oben Besuch von Tante Edit ...

Gruß