615 Stimmen

Wie können Sie mit der Windows-Befehlszeilenumgebung Text in einer Datei suchen und ersetzen?

Ich schreibe ein Stapeldatei-Skript mit der Windows-Befehlszeilenumgebung und möchte jedes Vorkommen eines Textes in einer Datei (z. B. "FOO") durch einen anderen (z. B. "BAR") ersetzen. Wie lässt sich das am einfachsten bewerkstelligen? Gibt es eingebaute Funktionen?

53voto

morechilli Punkte 9497

BatchSubstitute.bat auf dostips.com ist ein Beispiel für das Suchen und Ersetzen mit einer reinen Batch-Datei.

Es verwendet eine Kombination aus FOR , FIND y CALL SET .

Zeilen mit Zeichen zwischen "&<>]|^ falsch behandelt werden können.


9 Stimmen

Ich muss die Nützlichkeit einer Code-Snippet-Site in Frage stellen, deren Benutzungsbedingungen das Kopieren des Codes zu verbieten ("Sie dürfen die unter der Domain dostips.com bereitgestellten Informationen in keiner Form ohne ausdrückliche schriftliche Genehmigung des Domaininhabers verbreiten").

1 Stimmen

Ich stimme zu, dass ihre Bedingungen verwirrend sind, aber sie sagen auch: "Die unter der Domain dostips.com bereitgestellten Informationen sind hoffentlich nützlich", so dass ich davon ausgehe, dass sie sich freuen, wenn die Leute den Code kopieren, um ein Problem zu lösen. Ich bin mir nicht sicher, ob ich jemals die Geschäftsbedingungen gelesen habe und damit zufrieden war...

5 Stimmen

Das ist großartig. Ich liebe Antworten, bei denen man nicht etwas anderes herunterladen muss.

52voto

dbenham Punkte 122915

Hinweis - Im Update am Ende dieser Antwort finden Sie einen Link zur übergeordneten JREPL.BAT, die die REPL.BAT ablöst
JREPL.BAT 7.0 und höher unterstützt von Haus aus Unicode (UTF-16LE) über die /UTF sowie jeden anderen Zeichensatz, einschließlich UTF-8, über ADO!!!!


Ich habe ein kleines hybrides JScript/Batch-Dienstprogramm namens REPL.BAT geschrieben das sehr praktisch ist, um ASCII-Dateien (oder erweiterte ASCII-Dateien) über die Befehlszeile oder eine Batch-Datei zu ändern. Das rein systemeigene Skript erfordert keine Installation eines ausführbaren Programms eines Drittanbieters, und es funktioniert auf jeder modernen Windows-Version ab XP. Es ist außerdem sehr schnell, insbesondere im Vergleich zu reinen Batch-Lösungen.

REPL.BAT liest einfach stdin, führt eine JScript-Regex-Suche und -Ersetzung durch und schreibt das Ergebnis nach stdout.

Hier ist ein triviales Beispiel, wie Sie foo durch bar in test.txt ersetzen können, vorausgesetzt, REPL.BAT befindet sich in Ihrem aktuellen Ordner oder besser noch in Ihrem PATH:

type test.txt|repl "foo" "bar" >test.txt.new
move /y test.txt.new test.txt

Die JScript-Regex-Fähigkeiten machen es sehr leistungsfähig, insbesondere die Fähigkeit des Ersetzungstextes, auf erfasste Teilzeichenfolgen des Suchtextes zu verweisen.

Ich habe eine Reihe von Optionen in das Dienstprogramm aufgenommen, die es recht leistungsfähig machen. Zum Beispiel kann die Kombination der M y X Optionen ermöglichen die Änderung von Binärdateien! Die M Die Option "Mehrere Zeilen" ermöglicht die Suche über mehrere Zeilen hinweg. Die Website X Die Option eXtended substitution pattern bietet Escape-Sequenzen, die es ermöglichen, beliebige Binärwerte in den Ersetzungstext aufzunehmen.

Das gesamte Dienstprogramm hätte auch als reines JScript geschrieben werden können, aber die hybride Batch-Datei macht es überflüssig, jedes Mal, wenn Sie das Dienstprogramm verwenden möchten, explizit CSCRIPT anzugeben.

Hier ist das Skript REPL.BAT. Die vollständige Dokumentation ist in das Skript eingebettet.

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment

::************ Documentation ***********
::REPL.BAT version 6.2
:::
:::REPL  Search  Replace  [Options  [SourceVar]]
:::REPL  /?[REGEX|REPLACE]
:::REPL  /V
:::
:::  Performs a global regular expression search and replace operation on
:::  each line of input from stdin and prints the result to stdout.
:::
:::  Each parameter may be optionally enclosed by double quotes. The double
:::  quotes are not considered part of the argument. The quotes are required
:::  if the parameter contains a batch token delimiter like space, tab, comma,
:::  semicolon. The quotes should also be used if the argument contains a
:::  batch special character like &, |, etc. so that the special character
:::  does not need to be escaped with ^.
:::
:::  If called with a single argument of /?, then prints help documentation
:::  to stdout. If a single argument of /?REGEX, then opens up Microsoft's
:::  JScript regular expression documentation within your browser. If a single
:::  argument of /?REPLACE, then opens up Microsoft's JScript REPLACE
:::  documentation within your browser.
:::
:::  If called with a single argument of /V, case insensitive, then prints
:::  the version of REPL.BAT.
:::
:::  Search  - By default, this is a case sensitive JScript (ECMA) regular
:::            expression expressed as a string.
:::
:::            JScript regex syntax documentation is available at
:::            http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx
:::
:::  Replace - By default, this is the string to be used as a replacement for
:::            each found search expression. Full support is provided for
:::            substituion patterns available to the JScript replace method.
:::
:::            For example, $& represents the portion of the source that matched
:::            the entire search pattern, $1 represents the first captured
:::            submatch, $2 the second captured submatch, etc. A $ literal
:::            can be escaped as $$.
:::
:::            An empty replacement string must be represented as "".
:::
:::            Replace substitution pattern syntax is fully documented at
:::            http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx
:::
:::  Options - An optional string of characters used to alter the behavior
:::            of REPL. The option characters are case insensitive, and may
:::            appear in any order.
:::
:::            A - Only print altered lines. Unaltered lines are discarded.
:::                If the S options is present, then prints the result only if
:::                there was a change anywhere in the string. The A option is
:::                incompatible with the M option unless the S option is present.
:::
:::            B - The Search must match the beginning of a line.
:::                Mostly used with literal searches.
:::
:::            E - The Search must match the end of a line.
:::                Mostly used with literal searches.
:::
:::            I - Makes the search case-insensitive.
:::
:::            J - The Replace argument represents a JScript expression.
:::                The expression may access an array like arguments object
:::                named $. However, $ is not a true array object.
:::
:::                The $.length property contains the total number of arguments
:::                available. The $.length value is equal to n+3, where n is the
:::                number of capturing left parentheses within the Search string.
:::
:::                $[0] is the substring that matched the Search,
:::                $[1] through $[n] are the captured submatch strings,
:::                $[n+1] is the offset where the match occurred, and
:::                $[n+2] is the original source string.
:::
:::                Arguments $[0] through $[10] may be abbreviated as
:::                $1 through $10. Argument $[11] and above must use the square
:::                bracket notation.
:::
:::            L - The Search is treated as a string literal instead of a
:::                regular expression. Also, all $ found in the Replace string
:::                are treated as $ literals.
:::
:::            M - Multi-line mode. The entire contents of stdin is read and
:::                processed in one pass instead of line by line, thus enabling
:::                search for \n. This also enables preservation of the original
:::                line terminators. If the M option is not present, then every
:::                printed line is terminated with carriage return and line feed.
:::                The M option is incompatible with the A option unless the S
:::                option is also present.
:::
:::                Note: If working with binary data containing NULL bytes,
:::                      then the M option must be used.
:::
:::            S - The source is read from an environment variable instead of
:::                from stdin. The name of the source environment variable is
:::                specified in the next argument after the option string. Without
:::                the M option, ^ anchors the beginning of the string, and $ the
:::                end of the string. With the M option, ^ anchors the beginning
:::                of a line, and $ the end of a line.
:::
:::            V - Search and Replace represent the name of environment
:::                variables that contain the respective values. An undefined
:::                variable is treated as an empty string.
:::
:::            X - Enables extended substitution pattern syntax with support
:::                for the following escape sequences within the Replace string:
:::
:::                \\     -  Backslash
:::                \b     -  Backspace
:::                \f     -  Formfeed
:::                \n     -  Newline
:::                \q     -  Quote
:::                \r     -  Carriage Return
:::                \t     -  Horizontal Tab
:::                \v     -  Vertical Tab
:::                \xnn   -  Extended ASCII byte code expressed as 2 hex digits
:::                \unnnn -  Unicode character expressed as 4 hex digits
:::
:::                Also enables the \q escape sequence for the Search string.
:::                The other escape sequences are already standard for a regular
:::                expression Search string.
:::
:::                Also modifies the behavior of \xnn in the Search string to work
:::                properly with extended ASCII byte codes.
:::
:::                Extended escape sequences are supported even when the L option
:::                is used. Both Search and Replace support all of the extended
:::                escape sequences if both the X and L opions are combined.
:::
:::  Return Codes:  0 = At least one change was made
:::                     or the /? or /V option was used
:::
:::                 1 = No change was made
:::
:::                 2 = Invalid call syntax or incompatible options
:::
:::                 3 = JScript runtime error, typically due to invalid regex
:::
::: REPL.BAT was written by Dave Benham, with assistance from DosTips user Aacini
::: to get \xnn to work properly with extended ASCII byte codes. Also assistance
::: from DosTips user penpen diagnosing issues reading NULL bytes, along with a
::: workaround. REPL.BAT was originally posted at:
::: http://www.dostips.com/forum/viewtopic.php?f=3&t=3855
:::

::************ Batch portion ***********
@echo off
if .%2 equ . (
  if "%~1" equ "/?" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^:::" "" a
    exit /b 0
  ) else if /i "%~1" equ "/?regex" (
    explorer "http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx"
    exit /b 0
  ) else if /i "%~1" equ "/?replace" (
    explorer "http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx"
    exit /b 0
  ) else if /i "%~1" equ "/V" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^::(REPL\.BAT version)" "$1" a
    exit /b 0
  ) else (
    call :err "Insufficient arguments"
    exit /b 2
  )
)
echo(%~3|findstr /i "[^SMILEBVXAJ]" >nul && (
  call :err "Invalid option(s)"
  exit /b 2
)
echo(%~3|findstr /i "M"|findstr /i "A"|findstr /vi "S" >nul && (
  call :err "Incompatible options"
  exit /b 2
)
cscript //E:JScript //nologo "%~f0" %*
exit /b %errorlevel%

:err
>&2 echo ERROR: %~1. Use REPL /? to get help.
exit /b

************* JScript portion **********/
var rtn=1;
try {
  var env=WScript.CreateObject("WScript.Shell").Environment("Process");
  var args=WScript.Arguments;
  var search=args.Item(0);
  var replace=args.Item(1);
  var options="g";
  if (args.length>2) options+=args.Item(2).toLowerCase();
  var multi=(options.indexOf("m")>=0);
  var alterations=(options.indexOf("a")>=0);
  if (alterations) options=options.replace(/a/g,"");
  var srcVar=(options.indexOf("s")>=0);
  if (srcVar) options=options.replace(/s/g,"");
  var jexpr=(options.indexOf("j")>=0);
  if (jexpr) options=options.replace(/j/g,"");
  if (options.indexOf("v")>=0) {
    options=options.replace(/v/g,"");
    search=env(search);
    replace=env(replace);
  }
  if (options.indexOf("x")>=0) {
    options=options.replace(/x/g,"");
    if (!jexpr) {
      replace=replace.replace(/\\\\/g,"\\B");
      replace=replace.replace(/\\q/g,"\"");
      replace=replace.replace(/\\x80/g,"\\u20AC");
      replace=replace.replace(/\\x82/g,"\\u201A");
      replace=replace.replace(/\\x83/g,"\\u0192");
      replace=replace.replace(/\\x84/g,"\\u201E");
      replace=replace.replace(/\\x85/g,"\\u2026");
      replace=replace.replace(/\\x86/g,"\\u2020");
      replace=replace.replace(/\\x87/g,"\\u2021");
      replace=replace.replace(/\\x88/g,"\\u02C6");
      replace=replace.replace(/\\x89/g,"\\u2030");
      replace=replace.replace(/\\x8[aA]/g,"\\u0160");
      replace=replace.replace(/\\x8[bB]/g,"\\u2039");
      replace=replace.replace(/\\x8[cC]/g,"\\u0152");
      replace=replace.replace(/\\x8[eE]/g,"\\u017D");
      replace=replace.replace(/\\x91/g,"\\u2018");
      replace=replace.replace(/\\x92/g,"\\u2019");
      replace=replace.replace(/\\x93/g,"\\u201C");
      replace=replace.replace(/\\x94/g,"\\u201D");
      replace=replace.replace(/\\x95/g,"\\u2022");
      replace=replace.replace(/\\x96/g,"\\u2013");
      replace=replace.replace(/\\x97/g,"\\u2014");
      replace=replace.replace(/\\x98/g,"\\u02DC");
      replace=replace.replace(/\\x99/g,"\\u2122");
      replace=replace.replace(/\\x9[aA]/g,"\\u0161");
      replace=replace.replace(/\\x9[bB]/g,"\\u203A");
      replace=replace.replace(/\\x9[cC]/g,"\\u0153");
      replace=replace.replace(/\\x9[dD]/g,"\\u009D");
      replace=replace.replace(/\\x9[eE]/g,"\\u017E");
      replace=replace.replace(/\\x9[fF]/g,"\\u0178");
      replace=replace.replace(/\\b/g,"\b");
      replace=replace.replace(/\\f/g,"\f");
      replace=replace.replace(/\\n/g,"\n");
      replace=replace.replace(/\\r/g,"\r");
      replace=replace.replace(/\\t/g,"\t");
      replace=replace.replace(/\\v/g,"\v");
      replace=replace.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g,
        function($0,$1,$2){
          return String.fromCharCode(parseInt("0x"+$0.substring(2)));
        }
      );
      replace=replace.replace(/\\B/g,"\\");
    }
    search=search.replace(/\\\\/g,"\\B");
    search=search.replace(/\\q/g,"\"");
    search=search.replace(/\\x80/g,"\\u20AC");
    search=search.replace(/\\x82/g,"\\u201A");
    search=search.replace(/\\x83/g,"\\u0192");
    search=search.replace(/\\x84/g,"\\u201E");
    search=search.replace(/\\x85/g,"\\u2026");
    search=search.replace(/\\x86/g,"\\u2020");
    search=search.replace(/\\x87/g,"\\u2021");
    search=search.replace(/\\x88/g,"\\u02C6");
    search=search.replace(/\\x89/g,"\\u2030");
    search=search.replace(/\\x8[aA]/g,"\\u0160");
    search=search.replace(/\\x8[bB]/g,"\\u2039");
    search=search.replace(/\\x8[cC]/g,"\\u0152");
    search=search.replace(/\\x8[eE]/g,"\\u017D");
    search=search.replace(/\\x91/g,"\\u2018");
    search=search.replace(/\\x92/g,"\\u2019");
    search=search.replace(/\\x93/g,"\\u201C");
    search=search.replace(/\\x94/g,"\\u201D");
    search=search.replace(/\\x95/g,"\\u2022");
    search=search.replace(/\\x96/g,"\\u2013");
    search=search.replace(/\\x97/g,"\\u2014");
    search=search.replace(/\\x98/g,"\\u02DC");
    search=search.replace(/\\x99/g,"\\u2122");
    search=search.replace(/\\x9[aA]/g,"\\u0161");
    search=search.replace(/\\x9[bB]/g,"\\u203A");
    search=search.replace(/\\x9[cC]/g,"\\u0153");
    search=search.replace(/\\x9[dD]/g,"\\u009D");
    search=search.replace(/\\x9[eE]/g,"\\u017E");
    search=search.replace(/\\x9[fF]/g,"\\u0178");
    if (options.indexOf("l")>=0) {
      search=search.replace(/\\b/g,"\b");
      search=search.replace(/\\f/g,"\f");
      search=search.replace(/\\n/g,"\n");
      search=search.replace(/\\r/g,"\r");
      search=search.replace(/\\t/g,"\t");
      search=search.replace(/\\v/g,"\v");
      search=search.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g,
        function($0,$1,$2){
          return String.fromCharCode(parseInt("0x"+$0.substring(2)));
        }
      );
      search=search.replace(/\\B/g,"\\");
    } else search=search.replace(/\\B/g,"\\\\");
  }
  if (options.indexOf("l")>=0) {
    options=options.replace(/l/g,"");
    search=search.replace(/([.^$*+?()[{\\|])/g,"\\$1");
    if (!jexpr) replace=replace.replace(/\$/g,"$$$$");
  }
  if (options.indexOf("b")>=0) {
    options=options.replace(/b/g,"");
    search="^"+search
  }
  if (options.indexOf("e")>=0) {
    options=options.replace(/e/g,"");
    search=search+"$"
  }
  var search=new RegExp(search,options);
  var str1, str2;

  if (srcVar) {
    str1=env(args.Item(3));
    str2=str1.replace(search,jexpr?replFunc:replace);
    if (!alterations || str1!=str2) if (multi) {
      WScript.Stdout.Write(str2);
    } else {
      WScript.Stdout.WriteLine(str2);
    }
    if (str1!=str2) rtn=0;
  } else if (multi){
    var buf=1024;
    str1="";
    while (!WScript.StdIn.AtEndOfStream) {
      str1+=WScript.StdIn.Read(buf);
      buf*=2
    }
    str2=str1.replace(search,jexpr?replFunc:replace);
    WScript.Stdout.Write(str2);
    if (str1!=str2) rtn=0;
  } else {
    while (!WScript.StdIn.AtEndOfStream) {
      str1=WScript.StdIn.ReadLine();
      str2=str1.replace(search,jexpr?replFunc:replace);
      if (!alterations || str1!=str2) WScript.Stdout.WriteLine(str2);
      if (str1!=str2) rtn=0;
    }
  }
} catch(e) {
  WScript.Stderr.WriteLine("JScript runtime error: "+e.message);
  rtn=3;
}
WScript.Quit(rtn);

function replFunc($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10) {
  var $=arguments;
  return(eval(replace));
}

WICHTIGES UPDATE

Ich habe die Entwicklung von REPL.BAT eingestellt und es durch JREPL.BAT ersetzt. Dieses neuere Dienstprogramm hat die gleiche Funktionalität wie REPL.BAT und noch viel mehr:

  • Unicode UTF-16LE-Unterstützung über native CSCRIPT Unicode-Fähigkeiten und jeder andere Zeichensatz (einschließlich UTF-8) über ADO.
  • Lesen Sie direkt aus einer Datei / schreiben Sie direkt in eine Datei: Sie brauchen keine Pipes, Umleitungen oder Verschiebebefehle.
  • Vom Benutzer bereitgestelltes JScript einbinden
  • Übersetzungsfunktion ähnlich wie bei Unix tr, nur dass sie auch Regex-Suche und JScript-Ersetzen unterstützt
  • Nicht übereinstimmenden Text verwerfen
  • Ausgabezeilen mit Zeilennummer vorangestellt
  • und mehr...

Wie immer ist die vollständige Dokumentation in das Skript eingebettet.

Die ursprünglich triviale Lösung ist jetzt noch einfacher:

jrepl "foo" "bar" /f test.txt /o -

Die aktuelle Version von JREPL.BAT finden Sie unter DosTips . Lesen Sie alle nachfolgenden Beiträge in diesem Thema, um Beispiele für die Verwendung und die Geschichte der Entwicklung zu sehen.

0 Stimmen

Tolles Zeug! Ich liebe diese b / c der Einfachheit und die Art und Weise können Sie es auf was auch immer Skript anpassen, damit das Schreiben JS-Code als beschissenen Batch.

0 Stimmen

Bearbeiten - Die Option A wurde hinzugefügt, um nur Zeilen zu drucken, die geändert wurden. Außerdem wurde die Option X erweitert, um die \q zu vertreten " und Search-Literale unterstützen nun alle erweiterten Escape-Sequenzen, wenn die Optionen L und X kombiniert werden.

0 Stimmen

@dbenham - +1. Das ist ein raffinierter Ansatz, der sich auch für andere Aufgaben als nützlich erweisen wird. Danke für die Veröffentlichung.

47voto

Aman Punkte 876

FNR verwenden

Verwenden Sie die fnr Nutzen. Es hat einige Vorteile gegenüber fart :

  • Reguläre Ausdrücke
  • Optionale GUI. Verfügt über eine Schaltfläche "Befehlszeile generieren" zur Erstellung von Befehlszeilentext für die Batch-Datei.
  • Mehrzeilige Muster: Mit der grafischen Benutzeroberfläche können Sie problemlos mit mehrzeiligen Mustern arbeiten. In FART müssen Sie Zeilenumbrüche manuell umgehen.
  • Hier können Sie die Kodierung der Textdatei auswählen. Hat auch eine Option zur automatischen Erkennung.

FNR hier herunterladen: http://findandreplace.io/?z=codeplex

Beispiel für die Verwendung: fnr --cl --dir "<Directory Path>" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"

2 Stimmen

Das ist schön. Die Möglichkeit, die Befehlszeile von der Benutzeroberfläche aus zu generieren, ist eine nette, einfache Funktion, die mich schnell in Gang gebracht hat.

1 Stimmen

Sehr nützliches Werkzeug. Ich habe FART bereits ausprobiert, aber die Dokumentation ist veraltet.

1 Stimmen

Cooles Tool, das sogar reguläre Ausdrücke unterstützt. Das ist etwas, das FART fehlt.

31voto

Ferruccio Punkte 96076

Ich glaube nicht, dass es eine Möglichkeit gibt, dies mit eingebauten Befehlen zu tun. Ich würde vorschlagen, Sie laden etwas herunter wie Gnuwin32 o UnxUtils und verwenden Sie die sed Befehl (oder nur Download sed ):

sed -c s/FOO/BAR/g filename

3 Stimmen

Verwenden Sie cygwin ( cygwin.de ). Das ist die nächstbeste Möglichkeit, Linux tatsächlich zu installieren.

0 Stimmen

Es ist besser, wenn man eine Lösung anbieten kann, die nicht auf die Installation von Cygwin angewiesen ist. POSIX-Stringmanipulation ist ein Kinderspiel - dies unter Windows zu tun, ist ein wenig undurchsichtiger.

4 Stimmen

Gnuwin32 und UnxUtils sind eigenständige, für Windows entwickelte Binärprogramme. Sie sind nicht abhängig von cygwin.

29voto

Leptonator Punkte 3206

Ich weiß, ich komme zu spät zur Party.

Mir persönlich gefällt die Lösung bei: - http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace

Außerdem nutzen wir die Dedupe-Funktion ausgiebig, um täglich etwa 500 E-Mails über SMTP zuzustellen: - https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o

und beide funktionieren von Haus aus, ohne dass zusätzliche Tools oder Dienstprogramme benötigt werden.

REPLACER:

DEL New.txt
setLocal EnableDelayedExpansion
For /f "tokens=* delims= " %%a in (OLD.txt) do (
Set str=%%a
set str=!str:FOO=BAR!
echo !str!>>New.txt
)
ENDLOCAL

DEDUPLICATOR (beachten Sie die Verwendung von -9 für eine ABA-Nummer):

REM DE-DUPLICATE THE Mapping.txt FILE
REM THE DE-DUPLICATED FILE IS STORED AS new.txt

set MapFile=Mapping.txt
set ReplaceFile=New.txt

del %ReplaceFile%
::DelDupeText.bat
rem https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o
setLocal EnableDelayedExpansion
for /f "tokens=1,2 delims=," %%a in (%MapFile%) do (
set str=%%a
rem Ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.RightString
set str=!str:~-9!
set str2=%%a
set str3=%%a,%%b

find /i ^"!str!^" %MapFile%
find /i ^"!str!^" %ReplaceFile%
if errorlevel 1 echo !str3!>>%ReplaceFile%
)
ENDLOCAL

Gracias.

0 Stimmen

Das Batch-Skript macht nichts anderes als ein reines Dateikopieren - außerdem: warum bedanken Sie sich?

0 Stimmen

Die ursprüngliche Anfrage bestand darin, "FOO" durch "BAR" in einer Textdatei mithilfe eines Batch-Skripts und vorzugsweise mit integrierten Funktionen zu ersetzen. Wenn überhaupt, dann dankte ich dem Google-Gruppen-Beitrag, den ich gefunden hatte und der fantastisch funktioniert und den wir auch heute noch verwenden. Außerdem sehe ich Beiträge und Antworten wie diese als hilfreich für zukünftige Benutzer an. Ich verstehe Ihren Kommentar zum Kopieren von Dateien nicht. Natürlich wird der Inhalt einer Datei in eine andere Datei kopiert, aber auf der Grundlage der Daten werden die benötigten Informationen herausgeschnitten und geparst. Ich würde empfehlen, es erst einmal auszuprobieren ;)

0 Stimmen

Es ist im Grunde ein Dateikopierwerkzeug, das zwei statische Zeichenketten ersetzt - Sie hätten zumindest zwei Variablen einfügen können, damit Leute, die quiere um es auszuprobieren, muss man die Syntax nicht verstehen, um es tatsächlich benutzen zu können -- außerdem: Annahmen im Internet sind fast immer völlig falsch. Vergessen Sie das nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X