imeani
Goto Top

Funktionierendes Batch Script geht an einer bestimmten Datei "kaputt" und funktioniert danach gar nicht mehr (Bug?)

Ich hab ewig gebraucht um herauszufinden was zur Hölle nicht funktioniert und es ist total merkwürdig und abstrus...:

Also ich will per Batch automatisch nach bestimmten Wörtern suchen und durch andere ersetzen und es funktioniert alles ohne Probleme mit diesem Ansatz:

Inhalt suchen und ersetzen:

@echo off & setlocal enabledelayedexpansion
set "Datei=C:\test.txt"
set "Von=SERVER1\Freigabe$"
set "Nach=SERVER2\Freigabe$"
set "t=%temp%\text.tmp"
if exist "%t%" del "%t%"
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & set Line=!Line:%Von%=%Nach%! & echo !Line!>>"%t%"
move /y "%t%" "%Datei%"


Es funktioniert in meinen Tests mit Unterschiedlichen Dateien, Dateinamen, Pfaden und Wörtern.

Wenn ich (um ihm Beispiel des Codes oben zu bleiben) in C: eine Datei erstelle mit Namen test.txt und dann dort ein paar Wörter reinschreibe die ersetzt werden sollen funktioniert alles.
Dann lösche ich die Datei, nehme die Datei die ich eigentlich ändern will (für die ich die ganzen tests mache)
benenne sie GENAU GLEICH in "test.txt" verschiebe sie in den GENAU GLEICHEN Ordner mit dem das Batch die ganze Zeit funktioniert und wende dann das GENAU GLEICHE batch file an,
dann sagt er mir "das System kann die angegebene Datei nicht finden"

So jetzt kommts:
Lösche ich die Datei mit der es nicht funktioniert und schiebe wieder die alte Datei "test.txt", mit der es die ganze Zeit funktioniert hat, wieder an den GLEICHEN Platz wie zuvor sagt er mir IMMER noch
"das System kann die angegebene Datei nicht finden"
Und das obwohl es zuvor immer fehlerfrei klappte

Danach funktioniert das Batch gar nicht mehr egal was ich ändere und mache ich kriege immer den selben Fehler.


Die Datei die ich ändern will hat 9mb text und auch viele verschiedenen Sonderzeichen.
Was kann ich machen?

Content-Key: 275154

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

Printed on: April 18, 2024 at 23:04 o'clock

Mitglied: 114757
Solution 114757 Jun 20, 2015 updated at 09:16:32 (UTC)
Goto Top
Die Datei die ich ändern will hat 9mb text und auch viele verschiedenen Sonderzeichen.
Was kann ich machen?
Powershell nehmen face-wink wer macht noch Suchen und Ersetzen mit Batch heutzutage ?
$file = 'c:\test.txt'   
(gc $file | Out-string).replace('SERVER1\Freigabe$','SERVER2\Freigabe$') | Set-Content $file  
Gruß jodel32
Member: IMEANI
IMEANI Jun 20, 2015 updated at 09:49:27 (UTC)
Goto Top
(Mist ich habe aus versehen "hat zur Lösung beigetragen geklickt - ich hoffe der Thread verschwindet nicht irgendwo im Archiv)

Ich kenne mich nicht damit aus, ich habe was du geschrieben hast wohl falsch eingefügt.
Ich habe es so gemacht:

@echo off & setlocal enabledelayedexpansion
$file = 'C:\test.txt'
(gc $file | Out-string).replace('SERVER1\Freigabe$','SERVER2\Freigabe$') | Set-Content $file
set "Von=nein"
set "Nach=ja"
set "t=%temp%\text.tmp"
if exist "%t%" del "%t%"
for /f "usebackq delims=" %%i in ("%Datei%") do set "Line=%%i" & set Line=!Line:%Von%=%Nach%! & echo !Line!>>"%t%"
move /y "%t%" "%Datei%"

er meldet mir "$file - der befehl ist flasch oder konnte nicht gefunden werden"
Mitglied: 114757
114757 Jun 20, 2015 updated at 16:02:02 (UTC)
Goto Top
Oh no, das ist POWERSHELL kein BATCH !

In deine Batch kannst du das mit einer einzelnen Zeile so einbauen:
powershell -Executionpolicy ByPass -Command "&{$file = 'c:\test.txt' ; (gc -path $file | Out-string).replace('SERVER1\Freigabe$','SERVER2\Freigabe$') | Set-Content -path $file}"  
alles andere fliegt aus deiner Batchdatei raus, weil der Code allen anderen von dir ersetzt.

Sollte es noch nicht laufen musst du die ExecutionPolicy freigeben
https://blog.netspi.com/15-ways-to-bypass-the-powershell-execution-polic ...

Mehr zur Ausführung von PS Scripten steht hier:
Inhalt von XML-Dateien ändern
Gruß jodel
Member: IMEANI
IMEANI Jun 20, 2015 at 09:48:41 (UTC)
Goto Top
Wo in deiner Zeile schreibe ich rein welches Wort durch ein anderes Ersetzt werden soll?
Mitglied: 114757
114757 Jun 20, 2015 updated at 13:57:22 (UTC)
Goto Top
Zitat von @IMEANI:

Wo in deiner Zeile schreibe ich rein welches Wort durch ein anderes Ersetzt werden soll?

Öhm die Frage ist jetzt nicht wirklich ernst gemeint ?? Siehst du doch, ich habe genau deine in deiner Batch verwendeten Strings verwendet !

Erster Parameter von replace ist der String welcher gesucht wird und durch den zweiten Parameter ersetzt wird !
Member: IMEANI
IMEANI Jun 20, 2015 updated at 15:52:05 (UTC)
Goto Top
Klar. Sorry die Vorlage mit Server1 und Server2 war nur von eurer Seite reinkopiert. Ich hatte zwar ursprünglich mit dieser Vorlage angefangen zu arbeiten, aber das ist einige Zeit her und als ich die Vorlage dann einfach von dem Link hier reinkopiert habe hatte ich vergessen Server1 und Server2 durch meine Beispielwörter zu ersetzen. Dadurch stand ich zuerst ein wenig auf dem Schlauch. ;)

Ich habe jetzt die Anwesiungen bei den von der verlinkten Seiten befolgt und (ich denke) erfolgreich die ExecutionPolicy freigegeben.
Wenn ich danach deinen Code per Powershell ausführe dann sagt er mir folgendes:

Bild mit dem von dir vorgeschlagenen Code:
http://www.youscreen.de/jvmrbmtn87.jpg
Mitglied: 114757
114757 Jun 20, 2015 at 16:01:35 (UTC)
Goto Top
Zitat von @IMEANI:
Wenn ich danach deinen Code per Powershell ausführe dann sagt er mir folgendes:

Bild mit dem von dir vorgeschlagenen Code:
http://www.youscreen.de/jvmrbmtn87.jpg
Ok dann hast du noch Powershell 2.0 hab oben den -Path Parameter noch ergänzt...
Member: IMEANI
IMEANI Jun 20, 2015 at 17:48:51 (UTC)
Goto Top
Leider immer noch folgender Fehler:

http://www.youscreen.de/lmphjfdj45.jpg
Mitglied: 114757
114757 Jun 20, 2015 updated at 18:01:31 (UTC)
Goto Top
Zitat von @IMEANI:

Leider immer noch folgender Fehler:
http://www.youscreen.de/lmphjfdj45.jpg
Oh no ... Ich hatte dir geschrieben das du meine Zeile in die Batchdatei einfügen sollst nicht in die Powershell-Konsole, damit du es erst mal einfacher hast ! Das ist Quasi ein kombinierter Befehl der das Ausführen von Powershell-Code direkt in einer Batchdatei oder direkt in der CMD ermöglicht.

Les auch mal meinen letzten geposteten Link...
Member: IMEANI
IMEANI Jun 20, 2015 updated at 18:18:16 (UTC)
Goto Top
Ich verstehs nicht. Im letzten Satz sagst du mir ich soll deine Zeile in eine Batch Datei schreiben. Und du sagst mir ich soll deinen letzten Link lesen. Die Anleitung deines letzten Links beginnt mit: "Zuerst speichert man den Code in einer Textdatei mit der Endung .ps1."

Ich kriege das nicht zusammen. Ich hab heute zum ersten mal von Powershell gehört- für mich sind Batch und Powershell zwei verschiedene Dinge. Oder benutze ich das eine um das andere auszuführen?

Wie auch immer: schreibe ich deinen letzten code, mit abgeänderten Pfaden in eine Batch macht er nichts mit der Textdatei, ersetzt die Wörter nicht, und in dem Fenster bringt er mir keine Fehlermeldungen.
Mitglied: 114757
114757 Jun 20, 2015 updated at 18:32:45 (UTC)
Goto Top
Oder benutze ich das eine um das andere auszuführen?
Genau ..
Ist doch halb so wild:

@echo off
powershell -Executionpolicy ByPass -Command "&{$file = 'c:\test.txt' ; (gc -path $file | Out-string).replace('SERVER1\Freigabe$','SERVER2\Freigabe$') | Set-Content -path $file}"  
In eine Batchdatei gespeichert und ausgeführt, fertig. Läuft einwandfrei!

Die Anleitung deines letzten Links beginnt mit: "Zuerst speichert man den Code in einer Textdatei mit der Endung .ps1."
Das kann man auch machen, aber dann muss man natürlich den Vorspann mit powershell.exe -Executionpolicy ...... weglassen und nur den reinen Powershell-Code innerhalb der doppelten Anführungszeichen dort einfügen. Gibt halt mehrere Methoden. Meine ist halt kompakt direkt in eine Batch integrierbar ohne zusätzliches Powershell-File(ps1).

Viel Erfolg dann noch
I'm out now
Gruß jodel32