Top-Themen

Aktuelle Themen (A bis Z)

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

Probleme mit Leerzeilen und Tabs in suchen und ersetzen mit Batch

Frage Entwicklung Batch & Shell

Mitglied: Mario.Steinberg

Mario.Steinberg (Level 1) - Jetzt verbinden

19.02.2010, aktualisiert 18.10.2012, 3762 Aufrufe, 10 Kommentare

Hallo,

Ich heiße Mario und habe mich heute nach reichlicher Suche in eurem Forum mal angemeldet.
Folgendes ist mein Anliegen.

Ich möchte, beginnend von irgendeinem Verzeichnis aus durch selbiges, und rekursiv durch alle Unterverzeichnisse nach einer bestimmten Textdatei suchen.
In diesen soll dann ein Begriff gesucht und ersetzt werden.

Nach einigen Stunden Forumssuche und basteln bin ich zu folgendem Ergebnis gekommen. Erstmal danke, dass ich mittels Forum überhaupt dort hinkommen konnte.

01.
@echo off  
02.
setlocal enabledelayedexpansion 
03.
pushd . 
04.
cd /D s:\quellen\test 
05.
 
06.
set "t=%temp%\temp.txt"  
07.
  
08.
set "Von=WORKSPACE_A" 
09.
set "Nach=WORKSPACE"  
10.
 
11.
for /R %%i in (CMakeLists.txt) do ( 
12.
    if exist %%i ((if exist "%t%" del "%t%") & (for /f "usebackq delims=" %%f in ("%%i") do set "Line=%%f" & >>"%t%" echo !Line:%Von%=%Nach%!)) & (move "%t%" "%%i" ) )) 
13.
 
14.
popd
Eigentlich klappt auch alles so wie ich es mir vorstelle nur (und das sind meine Probleme):

- Alle Leerzeilen gehen verloren
- In den Files kann es Leerzeilen mit Tabs geben. Überall, wo das der Fall ist steht dann folgende Zeile: ECHO ist ausgeschaltet (OFF).

Im falle der leerzeilen habe ich auch schon versucht folgendes mit in die FOR-Schleife einzubauen . ...(if not defined !Line! >>%t% echo\)....
Dieses hat nur dazu geführt, dass nach jeder Zeile eine Leerzeile kam. Am zweiten Problem hat es nichts verändert.

Kann mir jemand weiterhelfen.
Ggf. würde ich das Script auch verwerfen, wichtig ist nur das Rekursive durchsuchen der Ordner und das anschließende ersetzen des Textes in den gefundenen Files.
Mitglied: bastla
19.02.2010, aktualisiert 18.10.2012
Hallo Mario_Steinberg und willkommen im Forum!

Versuch es damit:
01.
@echo off & setlocal enabledelayedexpansion 
02.
set "Quelle=s:\quellen\test" 
03.
set "t=%temp%\temp.txt"  
04.
  
05.
set "Von=WORKSPACE_A" 
06.
set "Nach=WORKSPACE"  
07.
 
08.
for /f "delims=" %%i in ('dir /s /b "%Quelle%\CMakeLists.txt"') do ( 
09.
    del "%t%" 2>nul 
10.
    for /f "tokens=1* delims=:" %%a in ('findstr /n "^" "%%i"') do ( 
11.
        set "Line=%%b" 
12.
        if defined Line (call set "Line=%%Line:%Von%=%Nach%%%") 
13.
        echo\!Line!>>"%t%" 
14.
15.
    move "%t%" "%%i" 
16.
)
Alternative: Für das Ersetzen ein wenig VBScript einbauen (wie zB hier) ...

Grüße
bastla
Bitte warten ..
Mitglied: Mario.Steinberg
23.02.2010 um 11:12 Uhr
Hallo bastla,

vielen Dank für deinen Code.
Hat auf anhieb funktioniert!!!

Gruß,
Mario
Bitte warten ..
Mitglied: Mario.Steinberg
23.02.2010 um 11:29 Uhr
Habe da nochmal ne kleine Frage, wenn ich den Code in Zeile 12 folgendermaßen ändere:

01.
 if defined Line (call set "Line=%%Line:%Von%=%Nach%%%" & call set "Line=%%Line:%Von2%=%Nach2%%%") 
Wäre es dann möglich mehrere Begriffe zu modifizieren (vorausgesetzt "Von2" und "Nach2" sind entsprechend gesetzt)?
Bitte warten ..
Mitglied: Biber
23.02.2010 um 11:35 Uhr
Moin Mario.Steinberg,

es ist immer nur das Ersetzen eines "AltWert" in einen "NeuWert" pro Aufruf möglich.
Aber du kannst ja zuerst die Zeile 12 ausführen lassen und als neue Zeile 13 diese modifizierte.

Grüße
Biber
Bitte warten ..
Mitglied: Mario.Steinberg
23.02.2010 um 11:40 Uhr
Also so?

01.
... 
02.
if defined Line (call set "Line=%%Line:%Von%=%Nach%%%") 
03.
if defined Line (call set "Line=%%Line:%Von2%=%Nach2%%%") 
04.
...
Bitte warten ..
Mitglied: Biber
23.02.2010 um 12:05 Uhr
Jepp, genau so.

Von der Logik her würde es aber wahrscheinlich sinnvoller sein, das Vorhandensein von %Line% einmal zu prüfen.
Dafür gegebenenfalls lieber prüfen, ob es denn einen zweiten zu erstzenden Begriff gibt (falls das nicht auch jedes Mal der Fall ist).

01.
..... 
02.
... 
03.
if defined Line ( 
04.
    REM Annahme 1: Ersetzung %von% in %Nach% gibt es "immer% 
05.
    call set "Line=%%Line:%Von%=%Nach%%%" 
06.
     REM Annahme 2: Manchmal (bei bestimmten Textdateien) auch eine zweite Ersetzung 
07.
     if defined Von2 call set "Line=%%Line:%Von2%=%Nach2%%%" 
08.
09.
...
Grüße
Biber
...
Bitte warten ..
Mitglied: Mario.Steinberg
23.02.2010 um 12:28 Uhr
Okay gute Sache!

Richtig gut wäre es, man ersetzt solange in einer Schleife, wie entsprechende Begriffe definiert sind.
Weißt du was ich meine?

01.
REM Dieses Beispiel ist !!! PSEUDOCODE !!! 
02.
 
03.
set "Von1=X1x" 
04.
set "Nach1=Y1Y" 
05.
 
06.
set "Von2=X2x" 
07.
set "Nach2=Y2Y" 
08.
 
09.
set "Von3=X3x" 
10.
set "Nach3=Y3Y" 
11.
 
12.
int count = 1; 
13.
 
14.
while(if defined Von<count>) 
15.
16.
   call set "Line=%%Line:%Von<count>%=%Nach<count>%%%" 
17.
}
Würde sowas gehen?
Bitte warten ..
Mitglied: Biber
23.02.2010 um 13:40 Uhr
Moin Mario.Steinberg,

ja... würde gehen.... aber bedingt durch fehlende Datentypen wie Arrays im Batch nur mit sozusagen "geschachtelten" Variablen.
Lässt sich mit "Delayed Expansion"/verzögerter Variablenauflösung hinbekommen, aber massiv auf Kosten der Lesbarkeit und Wartbarkeit.
Bei Interesse an diesem Weg: irgendwann hatten wir mal hier im Forum so eine Frage "Arrays im Batch?" oder so ähnlich - müsste über die Suchfunktion zu finden sein.

Ich würde diesen Weg als dritte Wahl ansehen und zuerst prüfen,
  • ob es nicht "wartbarer" mit einem 5maligen Copy&Paste und anpassen dieser Ersetz-Mir-Was-Zeile geht
  • oder ob ich nicht alle "Von"/"Nach"-Kombinationen in eine zweite Text-Datei lege, die ich wiederum mit eine FOR/F-Anweisung abarbeite.

Grüße
Biber
Bitte warten ..
Mitglied: Mario.Steinberg
23.02.2010 um 14:09 Uhr
Moin Biber,

ersteres mache ich bereits. Nur habe ich hier ein riesiges Geflecht auch Verzeichnissen mit entsprechenden Dateien vor mir.
Ein Durchlauf, bei dem ich z.B. 5 Wörter ersätze, dauert diverse Minuten.

Wenn man nun alle Files nur ein mal anfasst und in einem Durchlauf anpasst, würde man natürlich mächtig zeit sparen.

Mit der Lösung

01.
REM Annahme 2: Manchmal (bei bestimmten Textdateien) auch eine zweite Ersetzung  
02.
if defined Von2 call set "Line=%%Line:%Von2%=%Nach2%%%" 
kann man das natürlich schon erreichen wobei man sich dabei die Abfrage "if defined Von2" eigentlich sparen könnte da man ja vorher schon weiß wieviele Wörter man ersetzen will. Interessant wäre es halt da, wo man die Anzahl der zuersetzenden Wörter nicht kennt z.B. bei "Von1-n" "Nach1-n".

Ich denke der wir haben hier schon eine ziemlich gute Lösung.

Gruß,
Mario
Bitte warten ..
Mitglied: bastla
23.02.2010 um 19:05 Uhr
Hallo Mario.Steinberg!

Falls es doch auch etwas (in einen Batch integriertes) VBS sein dürfte, könnte die "Sieben auf einen Streich"-Variante etwa so aussehen:
01.
@echo off & setlocal 
02.
set "Quelle=s:\quellen\test"  
03.
 
04.
set R=%temp%\ReplaceMulti.vbs 
05.
>%R%  echo Von = Array( _ 
06.
>>%R% echo       "WORKSPACE_A", _ 
07.
>>%R% echo       "WORKSPACE_B", _ 
08.
>>%R% echo       "WORKSPACE_C", _ 
09.
>>%R% echo       "WORKSPACE_D", _ 
10.
>>%R% echo       "WORKSPACE_E", _ 
11.
>>%R% echo       "WORKSPACE_F", _ 
12.
>>%R% echo       "WORKSPACE_G" _ 
13.
>>%R% echo       ) 
14.
>>%R% echo Nach = Array( _ 
15.
>>%R% echo       "WORKSPACE_ohneA", _ 
16.
>>%R% echo       "WORKSPACE_ohneB", _ 
17.
>>%R% echo       "WORKSPACE_ohneC", _ 
18.
>>%R% echo       "WORKSPACE_ohneD", _ 
19.
>>%R% echo       "WORKSPACE_ohneE", _ 
20.
>>%R% echo       "WORKSPACE_ohneF", _ 
21.
>>%R% echo       "WORKSPACE_ohneG" _ 
22.
>>%R% echo       ) 
23.
>>%R% echo Set fso=CreateObject("Scripting.FileSystemObject") 
24.
>>%R% echo F=WScript.Arguments(0) 
25.
>>%R% echo T=fso.OpenTextFile(F).ReadAll:For i=0 To UBound(Von):T=Replace(T,Von(i),Nach(i)):Next 
26.
>>%R% echo fso.CreateTextFile(F).Write T 
27.
 
28.
for /f "delims=" %%i in ('dir /s /b "%Quelle%\CMakeLists.txt"') do cscript //nologo %R% "%%i"
Zu jedem Begriff nach "Von" ist die Ersetzung (bei "Nach") anzugeben ...

Grüße
bastla
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Suchen und Ersetzen, Kommentare und Leerzeilen behalten
gelöst Frage von M3talH3adBatch & Shell4 Kommentare

Hallo zusammen, für viele hier bestimmt ein leichtes Spiel: Ich möchte in einer ini-Datei per Batch suchen und ersetzen. ...

Batch & Shell
Leerzeilen per Batch aus Textdatei entfernen
gelöst Frage von Yenne97Batch & Shell9 Kommentare

Hallo Zusammen Ich bin neu hier. Ich würde gerne einen Batch schreiben der: 1. In einer Textdatei alle Leerzeichen ...

Batch & Shell
Suchen und Ersetzen mehrerer Suchbegriffe per Batch
gelöst Frage von makroll10Batch & Shell4 Kommentare

Hallo, ich habe eine Textdatei mit folgendem Inhalt (Beispiel): "Dies ist ein Text mit 1850101 oder auch mit 1750102 ...

Batch & Shell
Batch: Dateien innerhalb einer Ordnerstruktur nach einem Sting suchen und ersetzen
Frage von yousaintBatch & Shell2 Kommentare

Hallo zusammen, wie oben erwähnt, würde ich gerne innerhalb einer Ordnerstruktur (Dateien innerhalb aller Unterordner) in den Dateien nach ...

Neue Wissensbeiträge
MikroTik RouterOS

Mikrotik - Lets Encrypt Zertifikate mit MetaROUTER Instanz auf dem Router erzeugen

Anleitung von colinardo vor 5 StundenMikroTik RouterOS4 Kommentare

Einleitung Folgende Anleitung ist aus der Lage heraus entstanden das ein Kunde auf seinem Mikrotik sein Hotspot Captive Portal ...

Sicherheit

Sicherheitslücke in HP-Druckern - Firmware-Updates stehen bereit

Information von BassFishFox vor 6 StundenSicherheit

Ein weiterer Grund, dass Drucker keinerlei Verbindung nach "auswaerts" haben sollen. Unter Verwendung spezieller Malware können Angreifer aus der ...

Administrator.de Feedback

Entwicklertagebuch: Die Startseite wurde überarbeitet

Information von admtech vor 8 StundenAdministrator.de Feedback9 Kommentare

Hallo Administrator User, mit dem Release 5.7 haben wir unsere Startseite überarbeitet und die Beiträge und Fragen voneinander getrennt. ...

Vmware

VMware Desktopprodukte sind verwundbar

Information von Penny.Cilin vor 13 StundenVmware

Die VMware-Anwendungen zum Umgang mit virtuellen Maschinen Fusion, Horizon Client und Workstation sowie die Plattform NSX sind verwundbar. Davon ...

Heiß diskutierte Inhalte
Visual Studio
Vb.net-Tool zum Erzeugen einer Outlook-E-Mail
Frage von ahstaxVisual Studio24 Kommentare

Hallo, ich möchte gerne ein vb.net-Tool schreiben, das am Ende eine Outlook-E-Mail erzeugt. Grundsätzlich ist mir klar, wie das ...

Windows Server
RDP macht Server schneller???
Frage von JaniDJWindows Server16 Kommentare

Hallo Community, wir betrieben seit geraumer Zeit diverse virtuelle Maschinen und Server mit Windows Server 2012. Leider haben wir ...

Windows Netzwerk
Netzwerk Neustrukturierung
Frage von IT-DreamerWindows Netzwerk16 Kommentare

Hallo verehrte Community und Admins, bei uns im Haus steht eine Neustrukturierung an. Dafür benötige ich von euch ein ...

Windows 10
Windows 10 dunkler Bildschirm nach Umfallen
Frage von AkcentWindows 1015 Kommentare

Hallo, habe hier einen Windows 10 Rechner der von einem User umgefallen wurde (Beine übers Knie, an den PC ...