jochem
Goto Top

Kann man die Zeilennummer aus einer Find-Abfrage als Skip-Argument für eine For-Abfrage nutzen? Nee, aber gibt es einen anderen Weg?

Umgebung; W2K8-Domäne mit XP-Clients; Domäne läuft unter "Full-Service" eines RZ, daher hat der lokale Admin (ich) nicht Zugriff auf alle Funktionen face-sad Zur Identifikation der Benutzer, die eine Datei im Zugriff haben, wurde vom RZ eine (verschlüsselte) Batch-Routine geschrieben, welche die enstsprechenden Dateien und zugehörigen User auflistet. ich benötige aus dieser Datei aber nur die User, welche eine bestimmte Datei sperren.

Moin zusammen,
ich hol mal ein wenig aus. Wir setzen ein C/S-Kassenverfahren (IVR/Mach) ein, welches Daten von einem Server beim RZ auf einen lokalen Server bei uns überträgt. Diese Übertragung erfolgt alle drei Stunden zur vollen Stunde. Von diesem Server werden die Daten wiederum zeitgesteuert (5 Minuten nach der vollen Stunde) auf unseren Datenserver übertragen. Die Übertragung RZ - Server bei uns funktioniert immer. Die Übertragung Server bei uns - Datenserver nur manchmal (Grund siehe weiter unten). Grund der Übertragung ist der, daß in dem Verfahren Rechnungen erfaßt werden, die in einem anderen Verfahren gebucht werden. Dazu wird eine Excel-Tabelle erstellt, auf die mit einem Exel-Formular zugegriffen wird, um anhand der Rechnungsnummer schon die Grunddaten (Anschrift, Bankverbindung, etc.) zur Verfügung zu stellen. Hat nun ein Benutzer das Formular im Zugriff, während der "Update" der Excel-Tabelle läuft, findet keine Übertragung statt, da die Datei "in Benutzung" ist. Im Ergebnis können andere Benutzer nun nicht weiterarbeiten, da die neuen Datensätze noch nicht überspielt wurden und die Abfragen aufgrund der fehlenden Rechnungsnummer ins Leere laufen.
Früher konnte ich dann auf den Server gehen, dort die Geöffneten Dateien einsehen und die Benutzer trennen, die Überspeilung manuell durchführen und alle waren fröhlich. Heute funktioniert das nicht mehr (mangels Berechtigungen auf dem Server) und ich muß mich mit dieser Datei zufrieden geben. Die Datei hat mehrere 100 Zeilen und es ist relativ müßig, die mit der Hand am Arm durchzuforsten. Nun sucht isch eine weniger aufwändige Lösung, als die manuelle Suche.

Die Datei hat folgenden Aufbau:

Files opened remotely on server1:

[1342177289] E:\Daten\M2\FB1\Abt 1.1
    User:   M2MUELL
    Locks:  0
    Access: Read 
[1677721620] E:\Daten\M2\FB3\Abt 3.1\M2STEMB\Vorlagen\Normal.dotm
    User:   M2STEMB
    Locks:  0
    Access: Read Write 
[1744830489] E:\apps\scowi_5_11\exe\boost_regex-vc71-mt-gd-1_33.dll
    User:   M2GERLA
    Locks:  0
    Access: 
.........

Nun war meine Überlegung, ich durchsuche diese Datei mit FIND nach dern Zeilen, in denen der Gesuchte Dateiname vorkommt.
FINF /i /n "export\auswertung.xls" openfiles.txt  
Dieser Befehl liefert als Ergebnis:
---------- OPENFILES.TXT
[107][-603979437] E:\Export\Auswertung.xls
[131][1879048659] E:\Export\Auswertung.xls
[323][805307363] E:\Export\Auswertung.xls

Als nächsten Schritt wollte ich mit der Zeilennummer als Skip-Argument einen FOR /F-Befehl ausführen lassen. Schöne Idee, leider so nicht nutzbar, da der skip-Parameter nur ein einstelliges Argument akzeptiert.

So, und schon fangen meine Probleme an:
Wie kann ich
- die eine Datei lesen,
- die Zeilennummer ermitteln,
- diese Zeilennummer "skipfähig" aufbereiten,
- damit in eine zweite Datei gehen,
- die zugehörige Folgezeile ermitteln
- den Usernamen aus der Folgezeile ermitteln
- das Ergebnis in eine weitere Datei schreiben
- und dann zurück zur ersten Datei
- dort die nächste Zeilennummer lesen
- und das Spiel von neuem beginnen.

und vor allem, alles mit puren Batch-Mitteln.

Mir würde ja schon reichen, wenn ich aufgrund der FIND-Abfrage aus der Datei die Zeile n und Zeile n+1 extrahieren könnte, damit ich den User angelistet bekomme.

Vielleicht sehe ich aber im Augenblick den Wald vor lauter Bäumen nicht und es gibt einen ganz anderen Weg. Würde mich über Hinweise diesbezüglich freuen.

Gruß J face-smile chem

Content-Key: 166193

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

Printed on: April 20, 2024 at 02:04 o'clock

Member: bastla
bastla May 13, 2011 at 08:29:26 (UTC)
Goto Top
Hallo Jochem!

Aufgrund der beschriebenen Struktur (jeweils nur ein User / Block, keine Zeile beginnt mit ":") etwa so:
@echo off & setlocal
set "Ein=openfiles.txt"  
set "Aus=Users.txt"  
set "Gesucht=export\auswertung.xls"  
set "Gesucht2=User:"  

del "%Aus%" 2>nul  
set "Ausgabe="  
for /f "tokens=1* delims=:" %%i in ('findstr /i /n "^" "%Ein%"') do call :ProcessLine "%%j"  
goto :eof

:ProcessLine
echo %1|find /i "%Gesucht%">nul && (set "Ausgabe=%~1" & goto :eof)  
if not defined Ausgabe goto :eof
echo %1|find /i "%Gesucht2%">nul && (  
    for /f "tokens=1*" %%i in (%1) do echo %Ausgabe%	%%j  
    set "Ausgabe="  
)>>"%Aus%"  
goto :eof
In Zeile 16 befindet sich vor %%j ein <TAB> ...

[Nachtrag]Um aber auch Deine ursprüngliche Idee umzusetzen:
@echo off & setlocal
set "Ein=openfiles.txt"  
set "Aus=Users.txt"  
set "Gesucht=export\auswertung.xls"  
set "Gesucht2=User:"  

del "%Aus%" 2>nul  
set "Ausgabe="  
for /f "tokens=1-2* delims=" %%i in ('find /i /n "%Gesucht%"^<"%Ein%"') do (  
    set "Ausgabe="  
    for /f "tokens=2" %%a in ('more +%%i "%Ein%"') do if not defined Ausgabe (  
        echo [%%j]%%k	%%a
        set Ausgabe=true
    )
)>>"%Aus%"  
[/Nachtrag]

Grüße
bastla
Member: Jochem
Jochem May 13, 2011 at 09:35:42 (UTC)
Goto Top
Moin bastla,

fühl Dich geknutscht, gehätschelt, gesonstwas. Habs gerade mal so in eine Batch-Datei gehämmert und es läuft *freu*. jetzt werde ich mir das mal in aller Ruhe zu Gemüte führen und nachvollziehen, was Du so gebastelt hast und wo meine diesbezüglichen Lücken aufgetreten sind. Danke vielmals.

Gruß J face-smile chem