Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Sourcecode in Batchscripten durch Batchscript ändern

Frage Entwicklung Batch & Shell

Mitglied: juergen22

juergen22 (Level 1) - Jetzt verbinden

09.02.2006, aktualisiert 17.10.2012, 5164 Aufrufe, 6 Kommentare

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 :

<font class="code">

@pushd \
@for /F %%i in ('@findstr /S /I /M /P istPfad *.*') do call :change %%i
@popd
goto end

:change
?????????????????????

goto :eof

:end
exit
</font>





VBS läuft leider nicht, ist verboten.
Kann man das Problem mit reinem Dos lösen?

Mit freundlichen Grüßen Juergen22
Mitglied: Biber
09.02.2006, aktualisiert 17.10.2012
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 <a href=http://www.administrator.de/forum/dateieditierung-per-batchdatei-%28mac ... target="blank">Dateieditierung per Batchdatei</a>.

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
Bitte warten ..
Mitglied: juergen22
11.02.2006 um 11:16 Uhr
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:

<font class="code" >
@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
</font>

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?
<font class="code">
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
</font>


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.

Mit freundlichen Grüßen Jürgen22
Bitte warten ..
Mitglied: Biber
11.02.2006 um 12:26 Uhr
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.
Bitte warten ..
Mitglied: juergen22
11.02.2006 um 12:49 Uhr
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
Bitte warten ..
Mitglied: Biber
11.02.2006 um 12:59 Uhr
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
Bitte warten ..
Mitglied: juergen22
14.02.2006 um 13:34 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(1)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Erkennung und -Abwehr
Lokale Virenprüfstation : Windows 10: Ändern von Einstellungen verhinden (5)

Frage von TryAndSolve zum Thema Erkennung und -Abwehr ...

Windows Server
gelöst Word 2010 : Absatz - Abstand per GPO ändern (3)

Frage von johanna-p zum Thema Windows Server ...

Exchange Server
Exchange 2013, Outlook 2010 Standard-Absendeadresse ändern (4)

Frage von ingoue zum Thema Exchange Server ...

E-Mail
gelöst GMail: Anzeige der Mailübersicht ändern (7)

Frage von honeybee zum Thema E-Mail ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (34)

Frage von patz223 zum Thema Windows Userverwaltung ...

LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...