2017-09-28 1 views
-1

Ich brauche Batch-Datei, die nach einem Text (z. B. FOO) sucht und ersetzt durch ein weiterer Text (z. B. BAR) in allen Textdateien in einem Ordner und seinen Unterordnern.Batch-Skript - Suchen und Ersetzen von Text in mehreren Dateien in einem Verzeichnis ohne Benutzer zu bitten, ein Programm zu installieren oder andere Dateien zu meinem Batch-Skript hinzufügen

Ich muss diese Batch-Datei an den Benutzer geben. Es ist also nicht möglich, den Benutzer zu bitten, etwas anderes zu installieren, und ich möchte auch keine weiteren Dateien zu meinem Batch-Skript hinzufügen, ist das überhaupt möglich? Ich habe viele Antworten auf dieses Problem gefunden, aber alle raten, ein anderes Programm zu installieren oder dem Batch-Skript eine Datei hinzuzufügen. Kann mir bitte jemand dabei helfen?

+0

[Diese Antwort] (https://stackoverflow.com/q/60034) und [diese eine] (https://Stackoverflow.com/q/42052039) zeigen, wie Sie Text ersetzen, auch mit nativen Windows Funktionen; Versuchen Sie, Ihre Lieblingslösung innerhalb einer Schleife zu implementieren, um alle übereinstimmenden Dateien in einer Verzeichnisstruktur zu bearbeiten ... – aschipfl

Antwort

2

Hier ist eine einfache und reine Lösung ist - wir es replac.bat nennen lassen:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "_ROOT=%~3" & rem // (path to root directory; third command line argument) 
set "_MASK=%~4" & rem // (file search pattern; fourth command line argument) 
set "_SEARCH=%~1" & rem // (search string; first command line argument) 
set "_REPLAC=%~2" & rem // (replace string; second command line argument) 
set "_CASE=#"  & rem // (clear for case-insensitive search) 
set "_RECURS=#" & rem // (clear for non-recursive search) 
set "_TMPF=%TEMP%\%~n0_%RANDOM%.tmp" & rem // (path to temporary file) 

rem // Validate passed command line arguments, apply defaults: 
if not defined _SEARCH exit /B 1 
if not defined _ROOT set "_ROOT=." 
if not defined _MASK set "_MASK=*.txt" 

rem // Prepare `if` option (case-insensitivity) for later use: 
if defined _CASE (set "IFSW=") else (set "IFSW=/I") 
rem // Prepare `for` option (recursion) for later use: 
if defined _RECURS (set "FOROPT=/R") else (set "FOROPT=") 
rem // Change into root directory temporarily: 
pushd "%_ROOT%" || exit /B 1 
rem // Loop through all matching files in the directory tree: 
for %FOROPT% %%F in ("%_MASK%") do (
    rem // Write to temporary file: 
    > "%_TMPF%" (
     rem /* Read current file line by line; use `findstr` to precede every line by 
     rem its line number and a colon `:`; this way empty lines appear non-empty 
     rem to `for /F`, which avoids them to be ignored; otherwise empty lines 
     rem became lost: */ 
     for /F "delims=" %%L in ('findstr /N "^" "%%~fF"') do (
      rem // Store current line text: 
      set "LINE=%%L" & set "FLAG=" 
      setlocal EnableDelayedExpansion 
      rem // Remove line number prefix: 
      set "LINE=!LINE:*:=!" 
      rem // Skip replacement for empty line text: 
      if defined LINE (
       rem /* Use `for /F` loop to avoid trouble in case search or replace 
       rem strings contain quotation marks `"`: */ 
       for /F "tokens=1* delims== eol==" %%I in ("!_SEARCH!=!_REPLAC!") do (
        rem // Query to handle case-sensitivity: 
        if %IFSW% "!LINE!"=="!LINE:%%I=%%I!" (
         rem // Detect whether replacement changes line: 
         if not "!LINE!"=="!LINE:%%I=%%J!" (
          rem // Actually do the sub-string replacement: 
          set "LINE=!LINE:%%I=%%J!" 
          set "FLAG=#" 
         ) 
        ) 
       ) 
      ) 
      rem // Output the resulting line text: 
      echo(!LINE! 
      if defined FLAG (endlocal & set "FLAG=#") else (endlocal) 
     ) 
    ) 
    rem // Check whether file content would change upon replacement: 
    if defined FLAG (
     rem // Move the temporary file onto the original one: 
     > nul move /Y "%_TMPF%" "%%~fF" 
    ) else (
     rem // Simply delete temporary file: 
     del "%_TMPF%" 
    ) 
) 
popd 

endlocal 
exit /B 

Um dieses Skript zu verwenden, geben Sie die Suchzeichenfolge als erste bzw. die Ersetzungszeichenfolge als zweites Befehlszeilenargument an. das dritte Argument definiert das Stammverzeichnis der standardmäßig auf dem aktuellen Arbeitsverzeichnis, und der vierte definiert die Dateimuster, die standardmäßig auf *.txt:

replac.bat "Foo" "Bar" 

gelten die folgenden Einschränkungen:

  • alle passenden Dateien müssen einfache ASCII/ANSI-Textdateien mit Zeilenumbrüchen im Windows-Stil;
  • weder die Zeilen in den Dateien noch die Such- und Ersetzungszeichenfolgen können länger als ungefähr 8190 Byte/Zeichen sein;
  • Die Suchzeichenfolge darf nicht leer sein, sie darf nicht mit * oder ~ beginnen, und sie darf = nicht enthalten;
  • Die Ersetzungszeichenfolge darf nicht mit = beginnen;
  • Die Such- und Ersetzungszeichenfolgen dürfen nicht ! enthalten;
+0

@david und zuletzt, nicht gehen Sie an alle bei der Arbeit, dass Sie dieses Skript geschrieben haben :) –

1
for /r %i in (bar.txt) do echo ren "%i" foobar.txt 

Entfernen Sie die echo nur, wenn Sie die Dateien sicher sind korrekt umbenannt werden werden.

es in einer Batch-Datei zu verwenden, fügen Sie zusätzliche % auf die Variablen, wie zB:

@echo off 
for /r %%i in (bar.txt) do echo ren "%%i" foobar.txt 
+0

Was sollte anstelle von "i" sein? – David

+0

'%% i' ist die Variable, sie sollte sich nicht ändern. Aktualisieren Sie die Antwort, um zu erklären. –

+0

Ich möchte den Text selbst ändern (innerhalb der .txt-Datei) und nicht den Namen der Datei:/ – David

Verwandte Themen