Inhalt der Datei per Batch ändern

dinoldo

Cadet 4th Year
Registriert
Juni 2017
Beiträge
104
Hallo Leute,

ich habe eine Datei "T:\Daten\Version.log" die aktuell beispielsweise folgenden Inhalt als Versionskennzeichnung hat:

[NOVA]
Version=20235230403
04

Die Versionsnummer hat immer 13 Zeichen.

Ich möchte per Batchdatei folgendes erreichen.

Fall 1: Es soll das Datum (siehe den roten Text) mit aktuellen Datum geprüft werden.
Wenn das Datum übereinstimmt, dann sollen die letzten beiden Stellen (Index immer zweistellig - siehe den grünen Text) um eins erhöht und anschließend die Datei gespeichert werden.

Fall 2: Wenn das Datum nicht übereinstimmt, dann soll aktuelles Datum im Form YYMMTT (siehe den roten Text) eingetragen werden und die letzten beiden Stellen bekommen den Eintrag 01. Danach soll die Version.log Datei gespeichert werden.

Ich hoffe ihr könnt mir bitte helfen. 🙏

Besten Dank im Voraus!
Grüße, Dino
 
Und es muss eine Batch sein? Kein PHP oder AutoIt usw.!?
 
Wenn es auch Powershell sein darf:
PowerShell:
$file = 'D:\temp\Version.log'
$c = @()
get-content $file | % { if ($_.Split('=')[0] -eq 'Version') {
    $v = $_.Split('=')[1]
    if ($v.Substring(5,6) -eq (Get-Date -Format 'yyMMdd')) {
        $c = $c + ("Version=" + $v.Substring(0,11) + (([int]($v.Substring(11,2))+1).ToString().PadLeft(2,'0')))
    } else {
        $c = $c +  ("Version=" + $v.Substring(0,5) + (Get-Date -Format 'yyMMdd') + '01')
    }
} else { $c = $c +  $_ } }
$c | Set-Content $file
 
  • Gefällt mir
Reaktionen: NotNerdNotDau, Art Vandelay, Raijin und 4 andere
Hallo Korben2206,

ich kenne mich mir Powershell gar nicht aus. :-)

Ich habe es getestet. Bei mir wird keine Änderung in der Version.log gespeichert.

$file nabe ich natürlich angepasst.

Gruß,
Dino
 
dinoldo schrieb:
ich kenne mich mir Powershell gar nicht aus. :-)
Ohne dir auf den Schlips treten zu wollen: Mit batch offenbar auch nicht. ;)

Wenn du eh lernen musst wie du dein Problem löst, spielt es doch keine Rolle womit du das lernst. PowerShell ist als Lernobjekt in jedem Fall um ein Vielfaches sinnvoller als batch. Batch nutzen eigentlich nur noch Idioten wie ich, die damit jahrzehntelang aufgewachsen sind und sich .. leider .. entsprechendes KnowHow angeeignet haben, das sie nur schwer loslassen können.. Fehlgeleitete Nostalgie..
Batch ist keine Skriptsprache und hält sich daher auch an extrem vielen Stellen nicht an allgemeingültige Paradigmen der Programmierung. Batch is a bitch mit mehr Ausnahmen als Regeln, mehr Workarounds als Werkzeugen und mehr Krücken als Lösungen.


Wie dem auch sei, ich bin gerade nur am Handy und kann daher nur symbolisch helfen:

Schreibe eine for-Schleife, die die Datei zeilenweise durchläuft. In der Schleife prüfst du die aktuelle Zeile gegen dein Muster. Match erkannt, Zähler hochzählen oder auf 1 setzen, Anschließend die aktuelle Zeile in eine Output-Datei schreiben. So transferierst du die Quelldatei Zeile für Zeile in den Output und veränderst auf dem Weg dahin die gewünschte Versions-Zeile.

Wie man die einzelnen Schritte umsetzt, zeigen etliche Batch-Seiten im Netz, zB ss64.com oder dostips.com


Das PowerShell-Skript von @Korben2206 macht das tatsächlich ziemlich ähnlich. Schleife, Zeile matchen, verändern, in Output-Resultat anhängen und ganz am Ende den fertigen Output in die Datei schreiben.
 
@dinoldo also ich hab das mit dem Inhalt den du gepostet hast kurz getestet und es hat getan was es sollte. Aber es ist natürlich erstmal nur so kurz hingeklatscht, ohne große Überlegungen und relativ unflexibel.

Warum es bei dir nicht tut, kann verschiedene Gründe haben, z.B.:
  • die Datei die du verwendest entspricht nicht dem exakten Muster oben (Anzahl der Zeichen z.B.)
  • fehlende Schreibrechte (z.B. weil noch geöffnet), aber ich glaube dann würde es zumindest eine entsprechende Fehlermeldung geben. Also eher unwahrscheinlich.
Gibt es irgendeine Ausgabe? Da du sagst das du dich mit Powershell überhaupt nicht auskennst: wie genau hast du es getestet? Falls du es als .ps1-Datei gespeichert und per Rechtsklick ausgeführt hast, würde ich noch Befehl
Code:
Read-Host
anhängen, damit du die Ausgabe sehen kannst. (Read-Host wartet auf eine Eingabe vom Benutzer)


Anonsten würde ich mein Skript als Ansatz sehen und damit mal ein bischen herumspielen. Dazu z.B. die powershell_ise nutzen. Oder auch Visual Studio Code (mit Powershell-Erweiterung).
 
dinoldo schrieb:
Bei mir wird keine Änderung in der Version.log gespeichert.
Wahrscheinlich liegt es daran, dass bei dir in der Pfadangabe Leerzeichen oder Sonderzeichen enthalten sind.
Nur so eine Vermutung.

Setze die Pfadangabe bei $file in doppelte An- und Abführung:
$file = "D:\Meine Temp\Version.log"

Bei Pfadangaben, die in einer Variable gespeichert werden sollen, empfiehlt es sich immer, die Pfade mit doppelten An- und Abführungszeichen zu versehen.
Das gilt auch für Ordnernamen.
 
Ist der Inhalt der Datei oben eigentlich vollständig oder gibt es weitere Zeilen? Und wenn ja, sind diese ebenfalls wie Einträge in IINI-Dateien formatiert? Dann könnte man nämlich innerhalb Batch/PowerShell auch zB IniFile oder initool einsetzen, um Einträge zu ändern. Den Wert muss man natürlich trotzdem parsen.
 
@NotNerdNotDau
Es lag nicht an An- und Abführungszeichen.

@Korben2206
Ich habe die ps1-Datei per Doppelklick ausgeführt. Damit ist das PowerShell Fenster schnell aufgegangen und wieder geschlossen. Ich habe dann in PowerShell ISE es ausgeführt und dann diese Meldung:
Die Datei "T:\test.ps1" kann nicht geladen werden, da die Ausführung von Skripts auf diesem System deaktiviert ist. Weitere Informationen finden Sie unter "about_Execution_Policies"
Dann habe ich per Rechtsklick ausgeführt und die Datei "Version.log" wurde wie gewünscht geändert.
Wahrscheinlich ist das Ausführen per Doppelklick von Administrator deaktiviert?!
 
Bei PowerShell muss erst per ExecutionPolicy das Ausführen von Scripts genehmigt werden.

Findet man per Google innerhalb von 10 Sekunden...
 
dinoldo schrieb:
Es lag nicht an An- und Abführungszeichen.
Hätte ja sein können.
dinoldo schrieb:
Dann habe ich per Rechtsklick ausgeführt und die Datei "Version.log" wurde wie gewünscht geändert.
Wahrscheinlich ist das Ausführen per Doppelklick von Administrator deaktiviert?!
Standardmäßig werden PS-Skripte per Doppelklick nicht ausgeführt, sondern (mit Notepad) geöffnet.
Es sei denn, man hat das über diverse Einstellungen geändert.

Das Ausführen eines PS-Skripts über das Kontext-Menü per rechter Maustaste funktioniert grundsätzlich, allerdings nur dann, wenn die PS-Datei nicht auf dem Systemlaufwerk liegt.
Dafür braucht man keine höheren Rechte und auch keine andere Berechtigung per Ausführungsrichtlinie (EP).

Will man das Skript über die PS-Konsole (ISE) ausführen, muss man die EP anpassen.
Voreingestellt ist "Restricted". Da bietet sich z.B. "Bypass" oder "RemoteSigned" an.
Für das Ändern der EP benötigt man höhere Rechte (Als Administrator).

Wie es aussieht, hat das Skript ja funktioniert.
Wo ist also noch das Problem?
 
NotNerdNotDau schrieb:
Standardmäßig werden PS-Skripte per Doppelklick nicht ausgeführt, sondern (mit Notepad) geöffnet.

Ich glaube mittlerweile doch, wenn das Powershell anstatt der ollen CMD der default ist.
Und das ist wohl mittlerweile default so eingestellt.
 
  • Gefällt mir
Reaktionen: NotNerdNotDau
Zurück
Oben