juergen22
Goto Top

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 :

@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

Content-Key: 25653

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

Printed on: April 24, 2024 at 13:04 o'clock

Member: Biber
Biber Feb 09, 2006, updated at Mar 29, 2023 at 23:54:34 (UTC)
Goto Top
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.
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=

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
Member: juergen22
juergen22 Feb 11, 2006, updated at Mar 29, 2023 at 23:55:11 (UTC)
Goto Top
Hallo Biber,
danke für dein Feedback. Mein KnowHow in dieser neuen Materie ist relativ gering.
Stöbere aber sehr oft durch und lerne ständig dazu. Du bist ja ziemlich aktiv in dieser Beziehung. Ich habe mir den von dir vorgeschlagenen Thread angeschaut.

Das Resultat meiner Bemühungen siehst du unterhalb:

@echo off 
@echo teststart  >   d:\test\Replace.txt
@echo testende  >> d:\test\Replace.txt
setlocal 
Set "Workdir=d:\test\"   
pushd %Workdir% 
FOR /F %%a IN ('dir /b %WorkDir%\*.txt') DO call :loop %%a   
popd 
goto end 

:loop 
@echo %~f1
echo %~f1 
strep %~f1  %~f1.new 
del %~f1
ren %~f1.new %~f1
goto :eof 


:end 
exit

Wie beurteilst du meine Laienhaften bemühngen?
3 Sachen habe ich.

1:
Generell spricht nichts gegen den Einsatz des Tools "Strep" . Leider bekomme ich
eine Messgae "Cannot open input file".
Das lesen der Datei ist auch mit mehrfacher Prompt-Eingabe gescheitert.
Wo liegt das Problem?
Bei dem Aufruf "Strep inputfile outpufile" ist ja kaum etwas verkehrt zu machen. Oder?
Hast Du eine Ahnung wo das Problem liegen könnte?

2:
Wo kommt der Wert F1 her?
In einem ähnlichen Batch werden die Variablem sichtlich erzeugt?
setlocal 
FOR %%i in (c:\temp*.*) do call :loop "%%i"   
goto FireAbend 

:loop 
set part1=%1 
set prefix=%part1:~1,+4% 
set part1=%part1:~5,-1% 
@echo %1 
@echo %part1% 
ren %1 "%part1%"   

goto :eof 

:FireAbend 
Endlocal 


3:
Siehst du eine Möglichkeit die statische "Workdir"-Definition zu dynamisieren.
Ein Weg der im Vorfeld sicherlich durchgeführt werden kann.
ist eine :
dir d:\test\*.bat /s >> d:\test\dirscan.txt
Diese Pfadangaben müssten ausgelesen werden, da sich das Erkennen der Files zum Beispiel ja immer nur auf einer Ebene bewegt.


findstr auf alle bats von dirscan und übergabe der directory in eine Variable %dir%
aufruf von Programm Nr.1

Naja: wie auch immer. Ich versteh noch nicht alles, bin aber sehr motiviert.
Für deine Hilfe wäre ich dir sehr dankbar.

mfg Jürgen22
Member: Biber
Biber Feb 11, 2006, updated at Mar 29, 2023 at 23:55:27 (UTC)
Goto Top
Moin juergen22,

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.
Member: juergen22
juergen22 Feb 11, 2006 at 11:49:36 (UTC)
Goto Top
Hallo Biber,

habe das Problem mit den Subs einfach mit einer Argumenterweiterung gelöst.
Manchmal ist der kürzeste Weg einfach der Beste. Somit entfällt dieser dynamische Anspruch, da er bereits eingebunden ist.

Hier ist der Code, was hällst du davon:

@echo off 
@echo teststart >  d:\test\Replace.txt
@echo testende  >> d:\test\Replace.txt
setlocal 
Set "Workdir=d:\test\"   
pushd %Workdir% 
FOR /F %%a IN ('dir /b /s %WorkDir%\*.txt') DO call :loop %%a   
popd 
goto end 

:loop 
@echo %~f1 >> d:\test\scandir.txt
strep %~f1  %~f1.new 
del %~f1
ren %~f1.new %~f1
goto :eof 


:end 
exit


Was sagst du zu den anderen Punkten?

bye
Member: Biber
Biber Feb 11, 2006 at 11:59:52 (UTC)
Goto Top
Was sagst du zu den anderen Punkten?
Gegenfrage: hast Du meine Anmerkungen oben gelesen?

Ich kommt da jetzt nämlich ein wenig durcheinander, bei welchen Du auf Antwort wartest...

Bis später
Biber
Member: juergen22
juergen22 Feb 14, 2006 at 12:34:43 (UTC)
Goto Top
Hallo Biber,
unsere Kommentare habe sich etwas überschnitten. Alle Fragen sind soweit beantwortet und ich möchte mich für deine Hilfe recht herzlich bedanken.

mit freundlichen Grüßen
Jürgen