Problem PowerShell Programm wiederholt mit Batch-Datei abrufen
Hallo,
ich hatte vor einer Woche bereits einen Beitrag, zum ersetzen von Wörtern in einer Datei mit Batch erstellt. Dies funktionierte am Ende auch sehr gut. Jedoch wurden Ausrufezeichen nicht erkannt. Deshalb habe ich mich nach langem ringen doch für PowerShell entschieden. Meine Batch Datei ruft eine PowerShell Datei auf, welche die Wörter ersetzt. Dies funktioniert beim ersten Mal auch sehr gut. Beim zweiten Mal kommt folgender Fehler:
Der Code lautet:
Weis jemand woran es liegt? Vielen Dank schonmal.
Mit freundlichen Grüßen
Markus
ich hatte vor einer Woche bereits einen Beitrag, zum ersetzen von Wörtern in einer Datei mit Batch erstellt. Dies funktionierte am Ende auch sehr gut. Jedoch wurden Ausrufezeichen nicht erkannt. Deshalb habe ich mich nach langem ringen doch für PowerShell entschieden. Meine Batch Datei ruft eine PowerShell Datei auf, welche die Wörter ersetzt. Dies funktioniert beim ersten Mal auch sehr gut. Beim zweiten Mal kommt folgender Fehler:
Das Argument "Rep.ps1" für den -File-Parameter ist nicht vorhanden. Geben Sie als Argument für den -File-Parameter den Pfad zu einer vorhandenen .ps1-Datei an.
Der Code lautet:
set /a loop=0
:inta
set /a loop=%loop%+1
call:DoReplace "%Torsten%" "%Torsten:~0,-1%%loop%" cache\%KlausDieter:~0,-5%%loop%%Rainer% cache1\%KlausDieter:~0,-5%%loop%%Rainer%
exit /b
:DoReplace
echo ^(Get-Content "%3"^) ^| ForEach-Object { $_ -replace %1, %2 } ^| Set-Content %4>Rep.ps1
Powershell.exe -executionpolicy remotesigned -File Rep.ps1
if exist Rep.ps1 del Rep.ps1
GOTO :wer
:wer
set installel=%errorlevel%
if %loop%==%count% goto fall
if %installel%==0 goto inta
:fall
set /a loop=0
:intal
set /a loop=%loop%+1
call:DoReplaceL "%Horst%" "%Horst:~0,-1%%loop%" cache0\%Bruno:~0,-5%%loop%%Rainer% cache1\%Bruno:~0,-5%%loop%%Rainer%
exit /b
:DoReplaceL
echo ^(Get-Content "%3"^) ^| ForEach-Object { $_ -replace %1, %2 } ^| Set-Content %4>Rep.ps1
Powershell.exe -executionpolicy remotesigned -File Rep.ps1
if exist Rep.ps1 del Rep.ps1
GOTO :werl
:werl
set installel=%errorlevel%
if %loop%==%count% goto falll
if %installel%==0 goto intal
:falll
Weis jemand woran es liegt? Vielen Dank schonmal.
Mit freundlichen Grüßen
Markus
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 3719503610
Url: https://administrator.de/contentid/3719503610
Ausgedruckt am: 25.11.2024 um 00:11 Uhr
10 Kommentare
Neuester Kommentar
Moin,
Bzw. hast du rufst du das Script mit dem Arbeitsverzeichnis auf, in dem die Rep.ps1 liegt?
Andere Variante wäre, dass deine Rep.ps1 in der Zeile zuvor erst gar nicht erzeugt wird...
Das dürfte die Ursache sein.
Gruß
em-pie
... Geben Sie als Argument für den -File-Parameter den Pfad zu einer vorhandenen .ps1-Datei an.
liegen die Batch sowie die Rep.ps1 im selben Verzeichnis?Bzw. hast du rufst du das Script mit dem Arbeitsverzeichnis auf, in dem die Rep.ps1 liegt?
Andere Variante wäre, dass deine Rep.ps1 in der Zeile zuvor erst gar nicht erzeugt wird...
Das dürfte die Ursache sein.
Gruß
em-pie
Also die Rep.ps1 wird beim ersten Block(1-20) erzeugt und danach dann gelöscht. Beim zweiten Block(25-46) wird sie nicht mehr erzeugt, sondern es kommt gleich die Bemerkung:
Das ist doch quatschIn Zeile 10 willst du die Rep.ps1 erzeugen (erkennbar am >Rep.ps1)
In Zeile 11 willst du darauf zugreifen
In Zeile 12 wird die Datei gelöscht "If exists... delete..."
In Zeile 36 willst du die Datei Rep.ps1 wieder erzeugen
In Zeile 37 willst du erneut auf die neu erzeugte Datei zugreifen
In Zeile 38 wird auch diese Datei wieder gelöscht.
und durch dein Einbau von
PAUSE
sollst du erst mal prüfen, ob die Datei frühzeitig angelegt wird. Ich glaube weiterhin, dass die Datei weg ist, bevor die Powershell in den Zeilen 11 und 37 geladen wurdeZitat von @MarkusZieg:
Ne die bleibt. Wenn ich es starte und zwischen 10-11 ne Pause einfüge, dann ist zu dem Zeitpunkt Rep.ps1 erzeugt und wird in meinem Ordner angezeigt.
Ne die bleibt. Wenn ich es starte und zwischen 10-11 ne Pause einfüge, dann ist zu dem Zeitpunkt Rep.ps1 erzeugt und wird in meinem Ordner angezeigt.
und wenn du dann "Any Key" drückst, läuft dein Script/ Die Powershell weiter?
Falls nein, baue beim PS-Aufruf mal den kompletten Pfad ein:
Powershell.exe -executionpolicy remotesigned -File %~dp0Rep.ps1
Hallo,
komme auch nicht dahinter. Hab es mal bei mir abgespeckt und nur sowas hier reingesetzt
Auch mit pause sieht man, dass die Datei geschrieben, gelöscht und neu erstellt wird. Bekomme es nicht nachgestellt. x und y sind Nonsens. Hat ich nur um schnell zu sehen, ob die Datei neu geschrieben wird. Es wechselt sauber hind und her. Bzw. nur gci listet die Ordner.
Rein mit PS wäre es einfach. Mir dröhnt der Schädel.
Vor Jahren war TextCrawler mal komplett frei. Man konnte im Batch Modus dutzende von Dateien ändern. Die Tabelle mit ALT - NEU konnte man einfach anlegen, bzw. importieren - fertig.
Seit v2 oder v3 leider nur noch Trial. Die alte Version wäre exakt für so ein vorhaben geeignet. Ansonsten Hätte ich gesagt: Die Leitdatei keywords.txt als CSV aufbauen und dann einfach Lesen und Ersetzen. Wenn irgendwie die 3 Spalten erkennbar sind kann man das mit Notepad++ und Delimiter schnell zur vollwertigen CSV aufwerten. Habe leider im anderen Post die Datei nicht gesehen - bzw. deren Inhalt.
Nochmal zurück: die PS1 wurde bei mir immer unter c:\temp erstellt, wo auch die Batch liegt. Haut bei dir ein Virenscanner etc. dazwischen? Den schnellen Wechel oben vollzieht es bei mir problemlos.
Du hast ja schon mit ..1 ..2 etc. angefahgen. könntest auch mit rep02.ps1, rep03.ps1 weiter machen. Musst nur del anpassen. Aber eine Erklärung warum die Datei noch im Zugriff?? o.ä. ist hab ich nicht. So in schneller Abfolge wird bei mir keins ausgelassen.
mfg Crusher
komme auch nicht dahinter. Hab es mal bei mir abgespeckt und nur sowas hier reingesetzt
call:DoReplace
:DoReplace
echo ^(gci y)^ >Rep.ps1
Powershell.exe -executionpolicy remotesigned -File Rep.ps1
if exist Rep.ps1 del Rep.ps1
GOTO :DoReplaceL
:DoReplaceL
echo ^(gci x)^ >Rep.ps1
Powershell.exe -executionpolicy remotesigned -File Rep.ps1
if exist Rep.ps1 del Rep.ps1
GOTO :werl
:werl
pause
exit /b
Auch mit pause sieht man, dass die Datei geschrieben, gelöscht und neu erstellt wird. Bekomme es nicht nachgestellt. x und y sind Nonsens. Hat ich nur um schnell zu sehen, ob die Datei neu geschrieben wird. Es wechselt sauber hind und her. Bzw. nur gci listet die Ordner.
Rein mit PS wäre es einfach. Mir dröhnt der Schädel.
Vor Jahren war TextCrawler mal komplett frei. Man konnte im Batch Modus dutzende von Dateien ändern. Die Tabelle mit ALT - NEU konnte man einfach anlegen, bzw. importieren - fertig.
Seit v2 oder v3 leider nur noch Trial. Die alte Version wäre exakt für so ein vorhaben geeignet. Ansonsten Hätte ich gesagt: Die Leitdatei keywords.txt als CSV aufbauen und dann einfach Lesen und Ersetzen. Wenn irgendwie die 3 Spalten erkennbar sind kann man das mit Notepad++ und Delimiter schnell zur vollwertigen CSV aufwerten. Habe leider im anderen Post die Datei nicht gesehen - bzw. deren Inhalt.
Nochmal zurück: die PS1 wurde bei mir immer unter c:\temp erstellt, wo auch die Batch liegt. Haut bei dir ein Virenscanner etc. dazwischen? Den schnellen Wechel oben vollzieht es bei mir problemlos.
Du hast ja schon mit ..1 ..2 etc. angefahgen. könntest auch mit rep02.ps1, rep03.ps1 weiter machen. Musst nur del anpassen. Aber eine Erklärung warum die Datei noch im Zugriff?? o.ä. ist hab ich nicht. So in schneller Abfolge wird bei mir keins ausgelassen.
mfg Crusher