2016-09-06 3 views
1

Ich versuche, eine Batchdatei zu schreiben, um eine bestimmte Zeichenfolge "str2 => bbb" an eine Datei anzuhängen, wenn es noch nicht in der Datei. "str2" wird nach der Zeichenfolge "str1 => aaa" (die immer in der Datei vorhanden ist) gehen. Zum Beispiel:Anfügen einer Zeichenfolge in einer Datei nach einer anderen Zeichenfolge durch eine Windows - Batchdatei

datei.txt

...

str1 => aaa

...

Ende datei.txt

es wird werden:

datei.txt

...

...

...

str1 => aaa

str2 => bbb

..

Ende datei.txt

und die Batchdatei muss nicht destruktiv sein, das heißt, wenn „str2“ bereits in der Datei vorhanden ist, wird der Ansatz nichts tun.

Ich weiß, wie eine Zeichenfolge in der Datei zu finden:

FINDSTR "str2 => bbb" "file.txt" 

IF %errorlevel%==0 (
    ECHO FOUND 
) 

aber ich weiß nicht, was sonst die andere Zeichenfolge in der nächsten Zeile zu schreiben, zu tun.

+0

Sie könnten in Betracht ziehen, sich selbst durch die Textdatei zu arbeiten, prüfen Sie, ob die Zeile die richtige ist ('aaa') und schreiben Sie sie in eine temporäre Datei. Wenn die Linie, die Sie bekommen haben, die richtige ist, schreiben Sie danach 'bbb'. Zum Schluss löschen Sie den alten und benennen ihn um.Funktioniert nur, wenn die Strings in getrennten Zeilen stehen und nicht wirklich effizient sind. – geisterfurz007

Antwort

0

Verwenden von Powershell in Batch-Datei die Dinge zu vereinfachen

FINDSTR "str2 => bbb" "file.txt" 

    IF %errorlevel%==0 (
     ECHO FOUND 
     Goto END 
    ) 
    powershell -Command "(get-content File.txt) -replace "str1 => aaa", "$&`n str2 => bbb" | set-content File.txt" 
:end 

Der Powershell-Befehl den Inhalt der Datei erhalten wird und die Zeichenfolge mit Suchbegriff ($ &) + neue Linie + str2 ersetzen ...)

1

Da es für mich nicht klar ist, ob str2 sofort nach str1 in der Datei oder nur irgendwo auftreten muss, schrieb ich das folgende Skript, das beide Kriterien abdecken kann. Sie ändert die Eingabedatei für den Fall direkt, also seien Sie vorsichtig. Die Eingabedatei muss als Kommandozeilenargument speficied werden:

@echo off 
setlocal EnableExtensions DisableDelayedExpansion 

rem // Define constants here: 
set "FILE=%~1" & rem // (input file; `%~1` takes first command line argument) 
set "WORD1=str1" & rem // (word after which `%WORD2%` must be inserted) 
set "WORD2=str2" & rem // (word that must be present in the file) 
set "STRING2=%WORD2% => bbb" & rem // (full string to insert if `%WORD2%` is missing) 
set "SEPARATORS= = " & rem // (characters that separate the words from the rest) 
set "FIXEDPOS=#" & rem // (if not empty, defines that `%WORD2%` must be after `%WORD1%`) 

rem // Create line-break (carriage-return and line-feed): 
(for /F %%# in ('copy /Z "%~f0" nul') do set ^"CR+LF=%%#^ 
%= empty line =% 
^") 

rem // Ensure list of separators contains (ends) with space: 
if defined SEPARATORS (
    if not "%SEPARATORS:~-1%"==" " set "SEPARATORS=%SEPARATORS: =% " 
) else set "SEPARATORS= " 
setlocal EnableDelayedExpansion 
rem // Set up regular expression: 
if defined FIXEDPOS (
    rem /* `%WORD2%` must be in the line following `%WORD1%`, so define a dual-line 
    rem regular expression (both words must be present at the beginnings of lines): */ 
    set "REGEX=^%WORD1%[%SEPARATORS%].*!CR+LF!%WORD2%[%SEPARATORS%]" 
) else (
    rem /* Position of `%WORD2%` does not matter with respect to `%WORD1%`, 
    rem hence it merely must be present at the beginning of a line: */ 
    set "REGEX=^%WORD2%[%SEPARATORS%]" 
) 
rem // Search for regular expression in file: 
> nul findstr /I /R /C:"!REGEX!" "%FILE%" || (
    rem // No match encountered, so read entire file and deplete it afterwards: 
    for /F "delims=" %%L in ('findstr /N /R "^" "%FILE%" ^& ^> "%FILE%" break') do (
     endlocal 
     rem // Read a line, reset flag that defines whether or not to insert a string: 
     set "FLAG=" & set "LINE=%%L" 
     setlocal EnableDelayedExpansion 
     rem // Split off first word and compare with `%WORD1%`: 
     for /F "eol= tokens=1 delims=%SEPARATORS%" %%K in ("!LINE:*:=!") do (
      endlocal 
      rem // First word matches `%WORD1%`, so set flag: 
      if /I "%%K"=="%WORD1%" set "FLAG=#" 
      setlocal EnableDelayedExpansion 
     ) 
     rem // Append to file: 
     >> "%FILE%" (
      rem // Write original line: 
      echo(!LINE:*:=! 
      rem // Write string to insert in case flag is defined: 
      if defined FLAG echo(!STRING2! 
     ) 
    ) 
) 
endlocal 

endlocal 
exit /B 

Beachten Sie, dass dieses Skript prüft nicht, ob str1 mehrfach auftritt.

Verwandte Themen