Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWünsch Dir wasWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst Batch in vorletzte Zeile einer Datei schreiben

Mitglied: Bem0815

Bem0815 (Level 2) - Jetzt verbinden

17.05.2019, aktualisiert 09:13 Uhr, 615 Aufrufe, 19 Kommentare

Moin zusammen,

ich habe ein Script gebastelt, dass für die Personalabteilung die Logins der Mitarbeiter an ihren PC per Autostartscript erfasst, damit die Abteilung einen schnellen Überblick hat welche Mitarbeiter nicht anwesend waren. (Keine Zeiterfassung vorhanden die das regelt).

Das ganze soll die Daten in eine XML schreiben und diese wird dann per Javascript in einer HTML Datei in einer Table ausgegeben.

Die XML soll wie folgt aufgebaut sein:

Beim ausführen der Batch wird erst mal geprüft ob die Datei bereits existiert, falls nicht werden die ersten beiden Zeilen gesetzt.
Danach wird der Datensatz selbst geschrieben und die XML mit </DATEN> geschlossen.

Nun soll das schließende </DATEN> Tag ja nur einmal in der XML vorkommen und zwar ganz am Schluss.
Wenn ich die Batch aber ausführe wird das logischerweise jedes mal erneut in die Datei geschrieben.

Also so:

(Zeile 8 ist hier der unerwünschte Teil)

Was ich nun bräuchte ist entweder die Möglichkeit, dass mir die Batch nicht an das Ende der Datei einen neuen Datensatz schreibt sondern in die Vorletzte Zeile und in dem Fall prüft ob </DATEN> bereits vorhanden ist. Falls ja soll das nicht erneut in die Datei geschrieben werden.

Alternativ würde auch ein löschen der letzten Zeile gehen damit diese dann neu geschrieben werden kann.


Hier noch der aktuelle Batch code:

Kann mir da wer helfen?
Danke

Gruß Bem
Mitglied: erikro
17.05.2019 um 09:18 Uhr
Moin,

weiß Euer Betriebsrat von dem Ansinnen und hat dem zugestimmt?

Ansonsten nimm die Powershell, da die mit XML umgehen kann. Hier ist schön beschrieben, wie das geht:
https://www.langlitz-it.de/?p=1297

hth

Erik
Bitte warten ..
Mitglied: Bem0815
17.05.2019, aktualisiert um 09:58 Uhr
Zitat von erikro:

Moin,

weiß Euer Betriebsrat von dem Ansinnen und hat dem zugestimmt?

Gibt keinen.

Ansonsten nimm die Powershell, da die mit XML umgehen kann. Hier ist schön beschrieben, wie das geht:
https://www.langlitz-it.de/?p=1297

Hmm möglich, nur bin ich nicht sicher ob das an diesem Punkt noch viel Sinn macht, da das Script ansonsten fast fertig ist.
Wenn ich das jetzt nochmal in PS umschreibe gehen hier wohl nochmal 1-2 Stunden ins Land bis ich das geschrieben habe. z.B. die Syntax zur Ausgabe des Anzeigenamens aus der AD ist natürlich eine ganz andere.

Da das ganze als Loginscript auf allen Rechnern laufen soll hätte ich zusätzlich noch den Nachteil, dass ich bei PS erst mal für alle Kisten das Active Directory-Modul für Windows PowerShell aktivieren darf.

Das es grundsätzlich mehr Sinn macht PS zu benutzen wenn das direkt mit XML umgehen kann will ich hier natürlich nicht bestreiten.
Ich denke mit einer batch bin ich hier dennoch schneller.
Bitte warten ..
Mitglied: erikro
LÖSUNG 17.05.2019, aktualisiert um 11:14 Uhr
Moin,

Zitat von Bem0815:

Zitat von erikro:

Moin,

weiß Euer Betriebsrat von dem Ansinnen und hat dem zugestimmt?

Gibt keinen.

Dann muss wohl jeder einzelne Mitarbeiter zustimmen.


Ansonsten nimm die Powershell, da die mit XML umgehen kann. Hier ist schön beschrieben, wie das geht:
https://www.langlitz-it.de/?p=1297

Hmm möglich, nur bin ich nicht sicher ob das an diesem Punkt noch viel Sinn macht, da das Script ansonsten fast fertig ist.
Wenn ich das jetzt nochmal in PS umschreibe gehen hier wohl nochmal 1-2 Stunden ins Land bis ich das geschrieben habe. z.B. die Syntax zur Ausgabe des Anzeigenamens aus der AD ist natürlich eine ganz andere.


Das ist nicht wirklich schwer. Das Skript setzt voraus, dass die Datei existiert.

That's it. Hat keine zwei Stunden gedauert.

hth

Erik
Bitte warten ..
Mitglied: Bem0815
17.05.2019, aktualisiert um 11:23 Uhr
Danke dir für die Mühe. Leider bringt mich das nicht wirklich weiter.

Hab mit den 2 Stunden auch nicht das reine coding gemeint, sondern bis das Ding auch fehlerfrei läuft und aktuell sieht mir das so aus als würde es weiterhin genau darauf hinauslaufen.

Testlauf ergibt folgendes:

Bitte warten ..
Mitglied: erikro
LÖSUNG 17.05.2019 um 11:27 Uhr
Heut ist nix los. Hier das Skript nochmal mit Erzeugen der Datei, wenn sie nicht exisistiert und Datum im Dateinamen:

Bitte warten ..
Mitglied: erikro
17.05.2019, aktualisiert um 11:32 Uhr
Zitat von Bem0815:

Die Datei ist nicht am angegebenen Pfad. Alles andere sind Folgefehler. Ich habe das Skript getestet.


Kein AD vorhanden? Sind die RSAT installiert (zumindest die Powershell-Module)? Der Rest sind wieder Folgefehler.

Das Skript mit Erzeugen der Datei habe ich ja schon gepostet.

hth

Erik
Bitte warten ..
Mitglied: Bem0815
17.05.2019, aktualisiert um 11:46 Uhr
Ok,
das sieht schon mal echt gut aus.
Vielen dank.

Ein Problem habe ich noch, fällt dir ggfs. noch eine Alternative ein den Anzeigenamen des Domänenbenutzers über PS auszulesen?

Da erhalte ich als einziges noch einen Fehler:
Zum beheben brauche ich wie du gesagt hast die Remoteserver-Verwaltungstools für Windows 10. AD ist vorhanden.

Da das Script ja auf jedem PC bei der Anmeldung laufen soll müsste ich das domänenweit auf die Rechner klatschen.
Das scheint mir für den Zweck ein bisschen Overkill zu sein, daher wäre mir hier eine alternative die ohne das auskommt lieber.

Falls es aber nicht geht okay, dann muss ich das vorher verteilen.
Bitte warten ..
Mitglied: 139708
LÖSUNG 17.05.2019, aktualisiert um 12:07 Uhr
fällt dir ggfs. noch eine Alternative ein den Anzeigenamen des Domänenbenutzers über PS auszulesen?
AD Tools sind überflüssig, dazu nimmt man einfach einen ADSISEARCHER der ist in jeder Powershell per Default verfügbar:
Gruß wireguard
Bitte warten ..
Mitglied: Bem0815
17.05.2019 um 12:23 Uhr
Perfekt. Das funktioniert.

Vielen Dank euch beiden.
Bitte warten ..
Mitglied: erikro
17.05.2019 um 12:30 Uhr
Jo, auch das geht mit dem ADSI-Connector:

Das stellst Du vor das $new_name.set_Innertext und ersetzt das $(get-aduser ...) durch $displayname.
Bitte warten ..
Mitglied: erikro
17.05.2019 um 12:31 Uhr
Zitat von 139708:

fällt dir ggfs. noch eine Alternative ein den Anzeigenamen des Domänenbenutzers über PS auszulesen?
AD Tools sind überflüssig, dazu nimmt man einfach einen ADSISEARCHER der ist in jeder Powershell per Default verfügbar:

Noch einfacher.
Bitte warten ..
Mitglied: 139708
17.05.2019, aktualisiert um 13:10 Uhr
Es sei dir aber noch gesagt das das gleichzeitige Schreiben in eine einzige Datei zu Fehlern führt wenn zwei Systeme gleichzeitig versuchen das File zu ersetzen. D.h. System 1 schreibt das File gerade neu, während System2 das auch versucht, dann wird der Login-Eintrag von System2 nicht vorhanden sein weil der Schreibvorgang fehlschlägt. Es sollte also zumindest noch eine Lock-Abfrage eingefügt und solange gewartet werden bis das File wieder neu geschrieben werden kann!
Besser wäre es hier gleich ein Datenbank-Backend für die Transactions zu verwenden.
Bitte warten ..
Mitglied: erikro
17.05.2019 um 13:29 Uhr
Zitat von 139708:

Es sei dir aber noch gesagt das das gleichzeitige Schreiben in eine einzige Datei zu Fehlern führt wenn zwei Systeme gleichzeitig versuchen das File zu ersetzen. D.h. System 1 schreibt das File gerade neu, während System2 das auch versucht, dann wird der Login-Eintrag von System2 nicht vorhanden sein weil der Schreibvorgang fehlschlägt. Es sollte also zumindest noch eine Lock-Abfrage eingefügt und solange gewartet werden bis das File wieder neu geschrieben werden kann!
Besser wäre es hier gleich ein Datenbank-Backend für die Transactions zu verwenden.

Da hast Du vollkommen recht. Das könnte man so lösen:

Was mir daran aber nicht wirklich gefällt, ist, dass die User alle auf den Ordner und die Dateien Schreibzugriff brauchen.
Bitte warten ..
Mitglied: 139708
17.05.2019, aktualisiert um 14:08 Uhr
Das könnte man so lösen:
Dafür braucht es kein extra File, es reicht mit der System.IO.File Open Methode mit Schreibzugriff auf das File in einem try catch Konstrukt zuzugreifen. Wird eine entsprechende Exception geworfen weis man das das File gerade in Benutzung ist, das ganze in einer While Schleife.
Vorzuziehen ist aber weiterhin eine DB Instanz wenn Konsistenz gefordert ist.
Bitte warten ..
Mitglied: erikro
17.05.2019 um 14:06 Uhr
Zitat von 139708:

Das könnte man so lösen:
Dafür braucht es kein extra File, es reicht mit der System.IO Open Methode mit Schreibzugriff auf das File in einem try catch Konstrukt zuzugreifen. Wird eine entsprechende Exception geworfen weis man das das File gerade in Benutzung ist, das ganze in einer While Schleife.
Vorzuziehen ist aber weiterhin eine DB Instanz wenn Konsistenz gefordert ist.

Auf jeden Fall.
Bitte warten ..
Mitglied: Bem0815
17.05.2019, aktualisiert um 14:22 Uhr
Auch hierfür nochmal Danke.

Die Syntax hat nicht ganz gepasst.
Aber das hab ich mit meinen eingeschränkten PS Kenntnissen dann zumindest selbst noch hinbekommen, dass es läuft.

Sieht jetzt so aus:

Das mit dem Schreibzugriff ist natürlich nicht ganz optimal.
Ich denke ich kann mit einer versteckten Freigabe hier aber mit Security by Obscurity leben.
Bei uns wissen 99% der Mitarbeiter nicht einmal was die Kraftmuschel ist.

Und die Daten sollen nur für die Personalabteilung als kleine Hilfe gelten, damit die nicht jeden Tag manuell die Anwesenheit von allen Mitarbeitern prüfen müssen muss sondern anhand der Datei schon mal Anhaltspunkte haben und dann nur noch punktuell prüfen muss.

Für mehr wird das ganze nicht eingesetzt. Daher ist denke ich eine DB schon fast zuviel des guten.
Für die Abteilung ist das auch okay, dass hier Doppelteinträge entstehen können sollte sich jemand am Tag mehrmals anmelden. ;)

Ich denke nicht dass es jemand bei uns mit Schreibzugriff schafft so etwas hinzubekommen:
https://www.spiegel.de/karriere/spanien-beamter-kommt-sechs-jahre-nicht- ...
Bitte warten ..
Mitglied: erikro
17.05.2019 um 14:36 Uhr
Nein! Ob die Datei in Benutzung ist oder nicht, musst Du egal wie vor dem Auslesen ganz am Anfang testen. Sonst öffnest Du sie im Zustand mit z. B. Meier, Müller, Schulze. Kurz darauf öffnet eine andere Instanz die Datei auch in diesem Zustand. Die erste Instanz schreibt Hansen mit rein und speichert. Die zweite Instanz kann jetzt nicht speichern, weil die Lock-Datei exisitiert. Die erste löscht die Lock-Datei wieder. Jetzt darf die zweite schreiben und schreibt Petersen rein. Sie hat aber die Datei noch in dem Zustand ohne Hansen. Also überschreibt sie die gerade geschriebene Datei wieder und Hansen hat nicht gearbeitet.
Bitte warten ..
Mitglied: Bem0815
17.05.2019 um 14:53 Uhr
Ah okay, verstehe.

Ja stimmt, bin hier noch zu arg Batch gewöhnt.
Da wird ja nur Zeilenweise geschrieben ohne die Daten vorher beim auslesen im Cache zu haben.

Ok, dann ändere ich das nochmal.
Bitte warten ..
Mitglied: 139708
17.05.2019, aktualisiert um 15:12 Uhr
Hier optimierter Code für die Prüfung ob ein File im Zugriff ist, mit zus. 20s Abbruchbedingung damit das Ding nicht ewig hängt.
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Batch: Datei mit Datei durchsuchen
Frage von dergringo73Batch & Shell5 Kommentare

Hallo Ich habe folgendes Script was ich nun verändern möchte. Kurz zum aktuellen Stand: In der Datei products.json sollen ...

Batch & Shell
BATCH ini Datei Datei auslesen
gelöst Frage von Juergen42Batch & Shell2 Kommentare

Hallo zusammen, ich möchte eine ini Datei auslesen mit folgenden Aufbau INHALT DER INI ID=30 NAME="test1" PFAD="K:\Kontoauszug\Test1\*.pdf" PFAD_S="K:\Kontoauszug\Test1\Sicherung\" ID=28 ...

Batch & Shell
Batch Datei Ordnerüberwachung
Frage von Phant0xBatch & Shell1 Kommentar

Hallo zusammen, könntet ihr mir helfen eine Batch Datei zu schreiben, die einen bestimmten Ordner kontrolliert, ob sich Dateien ...

Batch & Shell
Batch Datei - Hilfe!
gelöst Frage von freshman2017Batch & Shell4 Kommentare

Einen wunderschönen "Wahl"- Sonntag, ich habe wieder eine Frage; wer kann mir helfen? Ich habe eine Ausgangsdatei (.txt) mit ...

Neue Wissensbeiträge
Sicherheit

Mehrere Sicherheitslücken in QNAP-NAS-Systemen aufgetaucht

Information von transocean vor 5 StundenSicherheit

Moin, QNAP hat drei Sicherheitsprobleme publik gemacht und empfiehlt sofortiges Update. Gruß Uwe

DNS

"Quickie": Mozillas "DNS over HTTPS" in pfSense blockieren

Anleitung von FA-jka vor 7 StundenDNS2 Kommentare

Hallo, Mozilla macht jetzt wohl wirklich Ernst mit "DNS over HTTPS" (kurz: DoH). Damit werden sämtliche DNS-Anfragen zu entsprechenden ...

Sicherheit
Störung bei Telematikinfrasturktur GEMATIK
Information von lcer00 vor 15 StundenSicherheit

Am 27. Mai 2020 ist es offenbar zu einer Fehlkonfiguration in der Zentralen Telematikinfrastruktur gekommen. Nähreres dazu findet sich ...

Informationsdienste

Trump vs Twitter - Angriff auf die Meinungsfreiheit?

Information von Frank vor 1 TagInformationsdienste3 Kommentare

Trump nutzt Twitter rege. Nach Hinweisen auf Falschbehauptungen drohte er dem Dienst. Was das bedeutet und die Konsequenzen dazu ...

Heiß diskutierte Inhalte
Sicherheits-Tools
Passwortmanager DGSVO (Deutscher Anbieter - Hoster)
Frage von SoccerdeluxSicherheits-Tools39 Kommentare

Hallo zuammen, ich arbeite für meine Kunden auf unterschiedlichen Geräten / Notebooks. Ich ärgere mich jedesmal, das ich mein ...

Batch & Shell
Ip-Adresse-Konfiguration speichern zur Wiederherstellung
gelöst Frage von alex1991Batch & Shell20 Kommentare

Hallo, ich bin eigentlich nicht in der IT-Abteilung, aber als Programmierer bin ich noch am nächsten dran. Deshalb wurde ...

Exchange Server
Automatische Antwort - Weiterleitung - zweite automatische Antwort - keine Weiterleitung?
Frage von dertowaExchange Server18 Kommentare

Hallo zusammen, da mich der Microsoftsupport ein wenig fassungslos machte versuche ich hier mal mein Glück und wenn es ...

Netzwerkgrundlagen
PF Sense - Keine Verbindung nach "außen"
gelöst Frage von mario89Netzwerkgrundlagen14 Kommentare

Hallo Leute, muss euch nochmalum Rat fragen. Weil irgendwie komme ich nicht weiter. Hintergrund ist, dass ich bei meiner ...