Script zum ersetzen eines String anhand einer definierten Liste
Hallo,
ich benötige ein Script, das einen Ordner permanent überprüft.
Sollte eine neue Datei dort hinterlegt werden, so soll das Script diese nach einem bestimmten String durchsuchen und diesen überschreiben bsp. "K0010 1" ändern in "K0010 5463"
und anschliessend die Datei in einen anderen Ordner verschieben.
Das erstetzen soll anhand einer Liste erfolgen bsw.:
"K0010 1"="K0010 5463"
"K0010 2"="K0010 5469"
"K0010 2"="K0010 5449"
Ist sowas einfach zu realisieren? Es sollte permanent im Hintergrund laufen.
Danke
Sascha
ich benötige ein Script, das einen Ordner permanent überprüft.
Sollte eine neue Datei dort hinterlegt werden, so soll das Script diese nach einem bestimmten String durchsuchen und diesen überschreiben bsp. "K0010 1" ändern in "K0010 5463"
und anschliessend die Datei in einen anderen Ordner verschieben.
Das erstetzen soll anhand einer Liste erfolgen bsw.:
"K0010 1"="K0010 5463"
"K0010 2"="K0010 5469"
"K0010 2"="K0010 5449"
Ist sowas einfach zu realisieren? Es sollte permanent im Hintergrund laufen.
Danke
Sascha
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 611539
Url: https://administrator.de/forum/script-zum-ersetzen-eines-string-anhand-einer-definierten-liste-611539.html
Ausgedruckt am: 06.04.2025 um 12:04 Uhr
12 Kommentare
Neuester Kommentar
Moin Sascha,
mit Powershell:
Der Ordner $Source wird alle $Interval Sekunden auf Dateien überprüft. Sind welche vorhanden, werden diese ersetzt und in den $Destination-Ordner geschrieben. Sofern der Vorgang erfolgreich war, wird die Datei anschließend in $Source gelöscht.
Die Liste $replace (Zeile 5-9) kann beliebig erweitert werden.
Gruß Thomas
mit Powershell:
$Source = 'C:\Quellordner'
$Interval = 60
$Destination = 'C:\Zielordner'
$replace = @{
"K0010 1" = "K0010 5463"
"K0010 2" = "K0010 5469"
"K0010 3" = "K0010 5449"
}
$replace = ($replace.keys | %{"-replace '$_','$($replace.$_)'"}) -Join ' '
while ($true) {
$Files = ls $Source -File
if ($Files) {
$Files | % {
try {
iex "'$(cat -enc utf8 -raw $_.Fullname)' $replace" -ea stop | Out-File -enc utf8 "$Destination\$_" -ea stop
rm $_.Fullname -ea stop
} catch {write-host -f 'red' $_.Exception.Message}
}
}
sleep $Interval
}
Der Ordner $Source wird alle $Interval Sekunden auf Dateien überprüft. Sind welche vorhanden, werden diese ersetzt und in den $Destination-Ordner geschrieben. Sofern der Vorgang erfolgreich war, wird die Datei anschließend in $Source gelöscht.
Die Liste $replace (Zeile 5-9) kann beliebig erweitert werden.
Gruß Thomas
Zitat von @rudizone:
Soweit scheint das zu funktionieren, jedoch nur wenn ich die Datei mit dem Skipt in das Quellverzeichniss schiebe.
wenn ich diese z.b. vom Desktop starte so überprüft er irgendwie den ganzen Desktop und kopiert diesen.
Ach sorry, hatte die $Source Variable nachträglich geändert und vergessen, dies auch in dem Befehl zum auflisten der Dateien zu tun. Habe das oben nun korrigiert.Soweit scheint das zu funktionieren, jedoch nur wenn ich die Datei mit dem Skipt in das Quellverzeichniss schiebe.
wenn ich diese z.b. vom Desktop starte so überprüft er irgendwie den ganzen Desktop und kopiert diesen.
Kann man in Powershell auch ausblenden was er gerade macht?
Ja.Man kann...
- das Skript mit der Zusatzoption -WindowStyle Hidden starten lassen (allerdings würde es dann nicht ganz trivial, wenn man das Skript stoppen möchte)
- das Skript über die Aufgabenplanung starten lassen
In deinem Fall wäre wohl letzteres empfehlenswerter.
Aufgabe erstellen -> unter Registerkarte Allgemein "unabhängig von der Benutzeranmeldung ausführen" anhaken, dadurch wird das Skript im Hintergrund ausgeführt.
Unter Registerkarte Aktion auf neu -> unter Programm/Skript trägst du nur powershell.exe ein - und bei Argumente dann -EP ByPass -File "C:\Pfad\zum\Skript.ps1"
Optional kannst du dann unter Registerkarte Trigger noch einstellen, ob das Skript automatisch gestartet werden soll.
sowie den Fensternamen anpassen?
Einfach folgendes an den Anfang des Skripts:$Host.UI.RawUI.WindowTitle = 'Beliebiger Fenstertitel'
kann man wenn ich das nicht im Hintergrund laufen lassen möchte, einen festen Text im Powershell Fenster anzeigen lassen?
klar geht das.Im Fenster Text ausgeben macht man mit dem Befehl write-host.
Was verstehst du unter "fester" Text? Einfach sowas wie "Skript wird ausgeführt" oder wäre es in dem Fall nicht besser, auch ein bisschen Statusupdates mit auszugeben, z.B.:
$Host.UI.RawUI.WindowTitle = 'Beliebiger Fenstertitel'
$Source = 'C:\Quellordner'
$Interval = 60
$Destination = 'C:\Zielordner'
$replace = @{
"K0010 1" = "K0010 5463"
"K0010 2" = "K0010 5469"
"K0010 3" = "K0010 5449"
}
$replace = ($replace.keys | %{"-replace '$_(?!\d)','$($replace.$_)'"}) -Join ' '
write-host "$((get-date).ToString("[dd.MM.yyyy HH:mm]")) Skript wird ausgeführt. "
while ($true) {
$Files = ls $Source -File
if ($Files) {
$Files | % {
try {
write-host -n "$((get-date).ToString("[dd.MM.yyyy HH:mm]")) Datei '$_' wird verabeitet... "
iex "'$(cat -enc utf8 -raw $_.Fullname)' $replace" -ea stop | Out-File -enc utf8 "$Destination\$_" -ea stop
rm $_.Fullname -ea stop
write-host -f green "erfolgreich. "
} catch {write-host -f 'red' $_.Exception.Message}
}
}
sleep $Interval
}
Achsooo...
dann müssen wir das ein wenig umstricken:
Wichtig: In dem $replace-Hashtable (Zeile 6-10) darf jetzt hinter dem Gleichzeichen jeweils nur noch die Nummer stehen, die eingefügt werden soll - also nicht mehr der KXXXX-prefix.
dann müssen wir das ein wenig umstricken:
$Host.UI.RawUI.WindowTitle = 'Beliebiger Fenstertitel'
$Source = 'C:\Quellordner'
$Interval = 60
$Destination = 'C:\Zielordner'
$replace = @{
"K0010 1" = "5463"
"K0010 2" = "5469"
"K0010 3" = "5449"
}
$replace = $replace.keys | %{"-replace '$($_ -replace '^(\S+)','($1(/\d+)?)')(?!\d)','`$1 $($replace.$_)'"}
write-host "$((get-date).ToString("[dd.MM.yyyy HH:mm]")) Skript wird ausgeführt. "
while ($true) {
$Files = ls $Source -File
if ($Files) {
$Files | % {
try {
write-host -n "$((get-date).ToString("[dd.MM.yyyy HH:mm]")) Datei '$_' wird verabeitet... "
iex "(cat -enc utf8 '$($_.Fullname)') $replace" | Out-File -enc utf8 "$Destination\$_" -ea stop
rm $_.Fullname -ea stop
write-host -f green "erfolgreich. "
} catch {write-host -f 'red' $_.Exception.Message}
}
}
sleep $Interval
}