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 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:
Nun war meine Überlegung, ich durchsuche diese Datei mit FIND nach dern Zeilen, in denen der Gesuchte Dateiname vorkommt.
Dieser Befehl liefert als Ergebnis:
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 chem
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
---------- 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 chem
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 166193
Url: https://administrator.de/contentid/166193
Ausgedruckt am: 21.11.2024 um 20:11 Uhr
2 Kommentare
Neuester Kommentar
Hallo Jochem!
Aufgrund der beschriebenen Struktur (jeweils nur ein User / Block, keine Zeile beginnt mit ":") etwa so:
In Zeile 16 befindet sich vor
[Nachtrag]Um aber auch Deine ursprüngliche Idee umzusetzen:
[/Nachtrag]
Grüße
bastla
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
%%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%"
Grüße
bastla