markuszieg
Goto Top

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:

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

Content-Key: 3719503610

Url: https://administrator.de/contentid/3719503610

Printed on: April 25, 2024 at 09:04 o'clock

Member: em-pie
em-pie Aug 22, 2022 updated at 06:46:06 (UTC)
Goto Top
Moin,

... 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
Member: MarkusZieg
MarkusZieg Aug 22, 2022 at 06:54:41 (UTC)
Goto Top
Hallo,

tatsächlich liegt Rep.ps1 nirgendwo ab. Wird zunächst im Ordner erzeugt und dann wieder gelöscht, so wie ich es verstanden habe. Kenne mich aber mit PowerShell gar nicht aus. Hab mir das etwas zusammengesucht.

Habe einen Ordner in dem ist die Batch und die Text Dateien. Die PowerShell wird dann erzeugt und auch wieder gelöscht. Ihr Lösungsvorschlag wäre also eine PowerShell Datei im Ordner abzuspeichern, welche dann einfach immer wieder aufgerufen wird und auch nach dem Ablauf erhalten bleibt.

Markus
Member: em-pie
em-pie Aug 22, 2022 at 07:00:11 (UTC)
Goto Top
Bau mal zwischen Zeile 10 und 11 zunächst ein PAUSE ein.
Dann hast du etwas Zeit um zu prüfen, ob die Rep.ps1 angelegt wird.

Ich vermute, dass die Datei gelöscht wird (Zeile 12) bevor Powershell geladen ist.
Member: MarkusZieg
MarkusZieg Aug 22, 2022 at 07:10:26 (UTC)
Goto Top
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:

(Get-Content "") | ForEach-Object { $_ -replace "", "~0,-1~0,-51RainerBruno:~0,-51Rainer } ^| Set-Content >Rep.ps1  
Member: em-pie
em-pie Aug 22, 2022 at 07:27:06 (UTC)
Goto Top
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 quatsch

In 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 wurde
Member: MarkusZieg
MarkusZieg Aug 22, 2022 at 07:40:05 (UTC)
Goto Top
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.
Member: em-pie
em-pie Aug 22, 2022 at 09:24:58 (UTC)
Goto Top
Zitat 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.

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
Member: Crusher79
Crusher79 Aug 22, 2022 at 17:45:07 (UTC)
Goto Top
Hallo,

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
Member: MarkusZieg
MarkusZieg Aug 23, 2022 at 05:08:13 (UTC)
Goto Top
Morgen,

zunächst Danke für die ganze Hilfe. Habe es jetzt nochmal versucht und kam auch mit dem kompletten Pfad nicht auf die Lösung.

Habe jetzt eine separate PS-Datei erstellt und übergebe jeden Zyklus die Variablen und lasse sie so durchlaufen. Funktioniert jetzt einwandfrei. Eine reine Batch-Datei (die selbst eine PS-Datei erstellt) wäre mir zwar lieber gewesen aber naja.

Vielen Dank nochmal!
Member: Crusher79
Crusher79 Aug 23, 2022 at 07:27:42 (UTC)
Goto Top
Naja PS ist die Zukunft - oder so ähnlich. Auf die Dauer hast du von sowas einen Mehrwert. face-wink