Sourcecode in Batchscripten durch Batchscript ändern
Hallo Spezialisten,
ich habe ein kleines Problem. Nachdem sich im Netzwerk die Pfadstrukturen oder die Pfadangaben geändert haben,
muss ich viele Batchscripte anpassen, da ich innerhalb der Programme nur mit absoluten Pfadangaben gearbeitet habe.
Kennt ihr eine Möglichkeit mit einem Batchscript die Pfadangaben auszutauschen. (Austausch auch mehrmals pro Zeile)
Ein Ansatz wäre es mit :
VBS läuft leider nicht, ist verboten.
Kann man das Problem mit reinem Dos lösen?
mfg Juergen22
ich habe ein kleines Problem. Nachdem sich im Netzwerk die Pfadstrukturen oder die Pfadangaben geändert haben,
muss ich viele Batchscripte anpassen, da ich innerhalb der Programme nur mit absoluten Pfadangaben gearbeitet habe.
Kennt ihr eine Möglichkeit mit einem Batchscript die Pfadangaben auszutauschen. (Austausch auch mehrmals pro Zeile)
Ein Ansatz wäre es mit :
@pushd \
@for /F %%i in ('@findstr /S /I /M /P istPfad *.*') do call :change %%i
@popd
goto end
:change
?????????????????????
goto :eof
:end
exit
VBS läuft leider nicht, ist verboten.
Kann man das Problem mit reinem Dos lösen?
mfg Juergen22
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 25653
Url: https://administrator.de/forum/sourcecode-in-batchscripten-durch-batchscript-aendern-25653.html
Ausgedruckt am: 23.04.2025 um 14:04 Uhr
6 Kommentare
Neuester Kommentar
Moin juergen22,
Gute Nchricht:
ich sehe eigentlich kein Problem in Deiner Anforderung. Klassische Batchanwendung.
Schlechte Nachricht:
mit native Batch ist es zwar lösbar (wechseln/ersetzen geht mit der CMD.exe an WindowsNT ff.), aber es wäre umständlich bis an den Rand der Albernheit, das mit puren CMD-Anweisungen zu machen bei einer Massenverarbeitung.
Zum Wechseln/Ersetzen gibt es kleine, flinke Freeware-Utilities, die im Batch einsetzbar sind. und die man/frau auch ruhigen Gewissens einsetzen sollte.
Eine etwas komplexere Anforderung hatten wir neulich hier im Forum unter Dateieditierung per Batchdatei (machine.config)
Dort ist auch von Kollege hanswd ein Freeware-Utility gepostet wurden, dass die Sucherei/Ersetzerei flott übernimmt.
Lies Dich bitte in den angegeben Thread ein - dort ist auch die grundsätzliche Mimik für derartige Aufgaben skizziert.
Wenn Du darüber geschlafen hast, ob so ein change-Utility bei Euch eingesetzt werden darf, melde Dich bitte wieder.
Wie geschrieben, es ginge auch mit purem CMD-Befehlssatz... aber wäre vergleichbar dem erneuten Erfinden der Fernsehröhre...
...würde ich nur for educational purposes in Erwägung ziehen.
Grüße Biber
Gute Nchricht:
ich sehe eigentlich kein Problem in Deiner Anforderung. Klassische Batchanwendung.
Schlechte Nachricht:
mit native Batch ist es zwar lösbar (wechseln/ersetzen geht mit der CMD.exe an WindowsNT ff.), aber es wäre umständlich bis an den Rand der Albernheit, das mit puren CMD-Anweisungen zu machen bei einer Massenverarbeitung.
Zum Wechseln/Ersetzen gibt es kleine, flinke Freeware-Utilities, die im Batch einsetzbar sind. und die man/frau auch ruhigen Gewissens einsetzen sollte.
Eine etwas komplexere Anforderung hatten wir neulich hier im Forum unter Dateieditierung per Batchdatei (machine.config)
Dort ist auch von Kollege hanswd ein Freeware-Utility gepostet wurden, dass die Sucherei/Ersetzerei flott übernimmt.
String Replace v1.1 - Remove/replace strings from text files (strep11.zip)
Nr. 1093 auf dieser Liste:
http://www.sac.sk/files.php?d=19&l=
Nr. 1093 auf dieser Liste:
http://www.sac.sk/files.php?d=19&l=
Lies Dich bitte in den angegeben Thread ein - dort ist auch die grundsätzliche Mimik für derartige Aufgaben skizziert.
Wenn Du darüber geschlafen hast, ob so ein change-Utility bei Euch eingesetzt werden darf, melde Dich bitte wieder.
Wie geschrieben, es ginge auch mit purem CMD-Befehlssatz... aber wäre vergleichbar dem erneuten Erfinden der Fernsehröhre...
...würde ich nur for educational purposes in Erwägung ziehen.
Grüße Biber
Moin juergen22,
na, wenn Du Du so nett bittest, dann will ich auch mal weitschweifig (aber konstruktiv) kritisieren:
(ich setze mal Zeilennummern davor)
Kommentare/Tipps:
Zeile 01 und 04 fasse ich immer zu meiner Standard-Batch-Eröffnung zusammen. Dann vergesse ich es nicht.
01 @echo off & setlocal
Bei den nächsten beiden Zeilen ist das "@"vor dem "Echo" nicht mehr nötig.
Das "@" unterdrückt ja nur die Anzeige des aktuellen Befehls, falls "Echo ON" ist. Und Du hast es ja auf "Echo off" gesetzt.
02 @echo teststart > d:\test\Replace.txt
03@echo testende >> d:\test\Replace.txt
05 und 07:
Wenn Du die Variable WORKDIR mit abschließendem Backslash definierst, dann hast Du in Zeile 07 einen Backslash zuviel.
M$ ist da zwar tolerant (mehrere Backslashes im DIR-Command werden als einer interpretiert), aber einklagbar ist das nicht.
Pfad-Variablen habe ich mir angewöhnt OHNE abschließenden Backslash zu definieren.
Also 05 Set "Workdir=d:\test"
07 die FOR..IN..DO-Anweisung.
Ist bei Dir (WinXP) richtig, einige W2000-Versionen haben da wohl einen Bug. Da wird bei der ersten Output-Zeile (also dem Text "Replace.txt") noch ein Zeichen "Seitenvorschub", sichtbar als "Zeichen für weiblich" mitgeschickt. Falls Du das Problem nicht hast - lass es so.
Falls ein "Weiblich"-Zeichen mitkommt, muss die FOR-Anweisung ergänzt werden.
FOR /F "delims=[weiblich]" %%a .... ----> ich bekomme das Zeichen "weiblich" hier nicht angezeigt, deshalb diese Darstellung.
Den Platzhalter [weiblich] also ersetzen durch ein Zeichen (den Kreis mit dem Kreuz darunter).
09 und 19 "goto :end" und ":end"
Du könntest alternativ auch schreiben "goto :eof" und die Definition der Sprungmarke ":eof" einfach weglassen.
Dieses kleine hilfreiche Feature hat M$ nämlich eingebaut. "goto :eof" geht, wenn es im Haupteil des Batches aufgerufen wird, raus. Analog zu einem Befehl "RETURN" in anderen Sprachen.
In dem :loop-Block
...da kommt ein Parameter an - der Parameter %1.
Drin steht der Dateiname "Replace.txt"
Wenn es ein Dateiname ist, bietet der CMD-Interpreter seit WinNT die Möglichkeit, den Dateinamen auch teilweise auszuwerten.
Aus der Hilfe von "FOR /?" am CMD-Prompt:
...
Zusätzlich wurde die Ersetzung von Verweisen auf FOR-Variablen erweitert.
Sie können jetzt folgende Syntax verwenden:
%~I - Expandiert %I und entfernt alle umschließenden
Anführungszeichen (").
%~fI - Expandiert %I zu einem vollständigen Dateinamen.
%~dI - Erzeugt nur den Laufwerkbuchstaben von %I.
%~pI - Erzeugt nur den Pfad von %I.
%~nI - Erzeugt nur den Dateinamen von %I.
usw.
Du verwendest die Variante "%~f1" == Expandiert %I zu einem vollständigen Dateinamen.
Ein "echo %~f1" wird also aufgelöst zu "echo D:\test\Replace.txt"
die Zeile 14 allerdings:
14 strep %~f1 %~f1.new
wird zu
strep D:\test\Replace.txt D:\test\Replace.txt.new
...und da hat Strep.exe ein Problem...Strep.exe ist "einen Tach älter", wie wir in Bremen sagen... die kommt NICHT mit doppelten Endungen klar bzw. erwartet die Dateien am Liebsten in der 8.3-nomenklatur (Acht Zeichen für Dateiname, 3 Zeichen Endung.
also wäre hier sinnvoller
strep %~f1 %~dpn1.new ODER strep %~f1 &workDir%\%~n1.new--->würde aufgelöst zu:
strep D:\test\Replace.txt D:\test\Replace.new
Zeile 20 "exit" weg damit..ersatzlos.
Ist eine Erfindung von irgendwelchen Amateuren bei der PC-Welt oder andern Bunte-Windows-Welt-Blättchen. Der Batch ist doch fertig. Wohin soll er denn ein "EXIT" machen? Der EXIT-Befehl in deinem Fall schließt das CMD-Fenster... und Du siehst keine einzige Fehlermeldung.
Zu Deiner zweiten Frage.... soweit ich erkennen, worauf Du hinauswillst... Abarbeitung aller Dateien in Unterverzeichnissen..
-> da wären die besseren Lösungsansätze die FOR..IN..DO-Varianten mit Parameter /R oder mit Parameter /D.
Bitte lies Dir in der Hilfe zu "FOR /?" diese Varianten mal durch und schau danach mal in unserem Bereich Batch & Shell nach "beispielen aus dem Leben". In meinem Batch-TutI ("FindLongPath") müsste ich so etwas verwendet haben.
Da das hier den Beitrag vollends sprengen würde, bitte ich Dich für Part2 eine neue Frage mit der konkreten Anforderung aufzumachen, falls Du es nicht allein knacken kannst.
Grüße Biber
Und die ursprüngliche Fragestellung "Sourcecode in Batchscripten durch Batchscript ändern" würde gern als "gelöst" gekennzeichnet sehen.
Neue Frage==neuer Thread...sonst kann nie jemand hier Antworten aufgrund des Titels wiederfinden.
na, wenn Du Du so nett bittest, dann will ich auch mal weitschweifig (aber konstruktiv) kritisieren:
(ich setze mal Zeilennummern davor)
01 @echo off
02 @echo teststart > d:\test\Replace.txt
03 @echo testende >> d:\test\Replace.txt
04 setlocal
05 Set "Workdir=d:\test\"
06 pushd %Workdir%
07 FOR /F %%a IN ('dir /b %WorkDir%\*.txt') DO call :loop %%a
08 popd
09 goto end
10
11 :loop
12 @echo %~f1
13 echo %~f1
14 strep %~f1 %~f1.new
15 del %~f1
16 ren %~f1.new %~f1
17 goto :eof
18
19 :end
20 exit
Kommentare/Tipps:
Zeile 01 und 04 fasse ich immer zu meiner Standard-Batch-Eröffnung zusammen. Dann vergesse ich es nicht.
01 @echo off & setlocal
Bei den nächsten beiden Zeilen ist das "@"vor dem "Echo" nicht mehr nötig.
Das "@" unterdrückt ja nur die Anzeige des aktuellen Befehls, falls "Echo ON" ist. Und Du hast es ja auf "Echo off" gesetzt.
02 @echo teststart > d:\test\Replace.txt
03@echo testende >> d:\test\Replace.txt
05 und 07:
Wenn Du die Variable WORKDIR mit abschließendem Backslash definierst, dann hast Du in Zeile 07 einen Backslash zuviel.
M$ ist da zwar tolerant (mehrere Backslashes im DIR-Command werden als einer interpretiert), aber einklagbar ist das nicht.
Pfad-Variablen habe ich mir angewöhnt OHNE abschließenden Backslash zu definieren.
Also 05 Set "Workdir=d:\test"
07 die FOR..IN..DO-Anweisung.
Ist bei Dir (WinXP) richtig, einige W2000-Versionen haben da wohl einen Bug. Da wird bei der ersten Output-Zeile (also dem Text "Replace.txt") noch ein Zeichen "Seitenvorschub", sichtbar als "Zeichen für weiblich" mitgeschickt. Falls Du das Problem nicht hast - lass es so.
Falls ein "Weiblich"-Zeichen mitkommt, muss die FOR-Anweisung ergänzt werden.
FOR /F "delims=[weiblich]" %%a .... ----> ich bekomme das Zeichen "weiblich" hier nicht angezeigt, deshalb diese Darstellung.
Den Platzhalter [weiblich] also ersetzen durch ein Zeichen (den Kreis mit dem Kreuz darunter).
09 und 19 "goto :end" und ":end"
Du könntest alternativ auch schreiben "goto :eof" und die Definition der Sprungmarke ":eof" einfach weglassen.
Dieses kleine hilfreiche Feature hat M$ nämlich eingebaut. "goto :eof" geht, wenn es im Haupteil des Batches aufgerufen wird, raus. Analog zu einem Befehl "RETURN" in anderen Sprachen.
In dem :loop-Block
...da kommt ein Parameter an - der Parameter %1.
Drin steht der Dateiname "Replace.txt"
Wenn es ein Dateiname ist, bietet der CMD-Interpreter seit WinNT die Möglichkeit, den Dateinamen auch teilweise auszuwerten.
Aus der Hilfe von "FOR /?" am CMD-Prompt:
...
Zusätzlich wurde die Ersetzung von Verweisen auf FOR-Variablen erweitert.
Sie können jetzt folgende Syntax verwenden:
%~I - Expandiert %I und entfernt alle umschließenden
Anführungszeichen (").
%~fI - Expandiert %I zu einem vollständigen Dateinamen.
%~dI - Erzeugt nur den Laufwerkbuchstaben von %I.
%~pI - Erzeugt nur den Pfad von %I.
%~nI - Erzeugt nur den Dateinamen von %I.
usw.
Du verwendest die Variante "%~f1" == Expandiert %I zu einem vollständigen Dateinamen.
Ein "echo %~f1" wird also aufgelöst zu "echo D:\test\Replace.txt"
die Zeile 14 allerdings:
14 strep %~f1 %~f1.new
wird zu
strep D:\test\Replace.txt D:\test\Replace.txt.new
...und da hat Strep.exe ein Problem...Strep.exe ist "einen Tach älter", wie wir in Bremen sagen... die kommt NICHT mit doppelten Endungen klar bzw. erwartet die Dateien am Liebsten in der 8.3-nomenklatur (Acht Zeichen für Dateiname, 3 Zeichen Endung.
also wäre hier sinnvoller
strep %~f1 %~dpn1.new ODER strep %~f1 &workDir%\%~n1.new--->würde aufgelöst zu:
strep D:\test\Replace.txt D:\test\Replace.new
Zeile 20 "exit" weg damit..ersatzlos.
Ist eine Erfindung von irgendwelchen Amateuren bei der PC-Welt oder andern Bunte-Windows-Welt-Blättchen. Der Batch ist doch fertig. Wohin soll er denn ein "EXIT" machen? Der EXIT-Befehl in deinem Fall schließt das CMD-Fenster... und Du siehst keine einzige Fehlermeldung.
Zu Deiner zweiten Frage.... soweit ich erkennen, worauf Du hinauswillst... Abarbeitung aller Dateien in Unterverzeichnissen..
-> da wären die besseren Lösungsansätze die FOR..IN..DO-Varianten mit Parameter /R oder mit Parameter /D.
Bitte lies Dir in der Hilfe zu "FOR /?" diese Varianten mal durch und schau danach mal in unserem Bereich Batch & Shell nach "beispielen aus dem Leben". In meinem Batch-TutI ("FindLongPath") müsste ich so etwas verwendet haben.
Da das hier den Beitrag vollends sprengen würde, bitte ich Dich für Part2 eine neue Frage mit der konkreten Anforderung aufzumachen, falls Du es nicht allein knacken kannst.
Grüße Biber
Und die ursprüngliche Fragestellung "Sourcecode in Batchscripten durch Batchscript ändern" würde gern als "gelöst" gekennzeichnet sehen.
Neue Frage==neuer Thread...sonst kann nie jemand hier Antworten aufgrund des Titels wiederfinden.