Der Batch-Code kopiert offensichtlich zusammen aus anderen Quellen, ohne wirklich den Code zu verstehen, hat viele kleine Fehler. Der folgende Fixcode funktioniert für eine Datei mit dem Namen new-text
.
@echo off
setlocal
call :FindReplace "#TargetfromODconfig#" "oldtest" new-text
rem INSERT HERE YOUR OTHER CODE.
endlocal
exit /B
rem The command above exits processing of this batch file to
rem avoid an unwanted fall through to the subroutine below.
rem Subroutine FindReplace searches for all occurrences of the string passed
rem as first parameter to this subroutine in all files matching the file name
rem or file name pattern passed as third parameter in current directory or
rem any subdirectory and replaces all found strings in all found files with
rem the string passed as second parameter.
:FindReplace <findstr> <replstr> <file>
set "TempXmlFile=%TEMP%\tmp.xml"
if not exist "%TEMP%\_.vbs" call :MakeReplace
for /F "tokens=*" %%a in ('dir "%~3" /A-D /B /ON /S 2^>nul') do (
for /F "usebackq" %%b in (`%SystemRoot%\System32\Findstr.exe /I /M /C:"%~1" "%%a"`) do (
echo(&Echo Replacing "%~1" with "%~2" in file "%%~nxa"
<"%%a" %SystemRoot%\System32\cscript.exe //nologo "%TEMP%\_.vbs" "%~1" "%~2">"%TempXmlFile%"
if exist "%TempXmlFile%" move /Y "%TempXmlFile%" "%%~fa" >nul
)
)
del "%TEMP%\_.vbs"
goto :EOF
rem The command above exits subroutine FindReplace and batch processing
rem is continued on the line below the line which called this subroutine.
rem Subroutine MakeReplace just creates a small Windows console script.
:MakeReplace
>"%TEMP%\_.vbs" echo with Wscript
>>"%TEMP%\_.vbs" echo set args=.arguments
>>"%TEMP%\_.vbs" echo .StdOut.Write _
>>"%TEMP%\_.vbs" echo Replace(.StdIn.ReadAll,args(0),args(1),1,-1,1)
>>"%TEMP%\_.vbs" echo end with
goto :EOF
rem The command above exits subroutine MakeReplace and batch processing
rem is continued on the line below the line which called this subroutine.
new-text
ist ein seltsamer Name für einen Namen Pattern-Datei oder eine Datei. Ich nehme an, der Code sollte auf einer * .xml-Datei laufen und daher sollte der Name dieser XML-Datei anstelle von new-text
verwendet werden.
Der fragliche Stapelcode fehlt alle goto :EOF
oder (sind identisch), um die aktuelle Subroutine oder die gesamte Batch-Datei zu beenden. Ich habe den Befehl exit /B
hinzugefügt, um die Verarbeitung der Batch-Datei zu beenden, und goto :EOF
, um jede Subroutine zu beenden.
TMP ist eine vordefinierte Umgebungsvariablen wie TEMP die den Pfad für temporäre Dateien in Ordner enthält. Daher sollte der Wert der Umgebungsvariablen TMP nicht von etwas anderem überschrieben werden, da dies zu unerwartetem Verhalten führen kann, wenn eine der verwendeten Konsolenanwendungen oder Befehle von TMP erwartet, dass sie den Pfad zum Ordner für temporäre Dateien enthält. Der obige Stapelcode verwendet stattdessen die Umgebungsvariable TempXmlFile
. Führen Sie in einem Eingabeaufforderungsfenster den Befehl set
aus, um die vordefinierten Umgebungsvariablen mit ihren aktuellen Werten anzuzeigen.
Der Ordner für temporäre Dateien enthält normalerweise Leerzeichen. Jeder Datei-/Ordnername ohne oder mit einem Pfad, der ein Leerzeichen oder eines dieser Zeichen enthält &()[]{}^=;!'+,`~
muss in doppelte Anführungszeichen gesetzt werden, um korrekt interpretiert zu werden. Daher muss jeder Datei-/Ordnerpfad mit einem Verweis auf die Umgebungsvariable TEMP oder TMP in Anführungszeichen gesetzt werden, um korrekt interpretiert zu werden.
Die dritte Parameterzeichenfolge, die an die Subroutine FindReplace
übergeben wird, ist der Name der zu ändernden Datei oder das Dateinamensmuster, das in doppelte Anführungszeichen eingeschlossen werden muss, wenn es ein Leerzeichen oder ein anderes Sonderzeichen enthält. Daher ist es nicht gut, "%3"
auf Befehl DIR zu verwenden, da ein Dateiname, der bereits in doppelte Anführungszeichen eingeschlossen ist, zwei doppelte Anführungszeichen um den Dateinamen ergibt. Viel besser ist daher "%~3"
, weil %~3
bei der Ausführung durch dritte Parameterzeichenfolge ohne umgebende doppelte Anführungszeichen ersetzt wird.
2^>nul
ist eine Umleitung für Fehlermeldungen gedruckt STDERR an das Gerät sie NUL zu unterdrücken, behandeln mit den redirection operator>
mit ^
entweichenden auf laufenden Befehl DIR angewendet werden und auf FOR wird nicht interpretiert Befehlszeile.Diese zusätzliche Umleitung unterdrückt die Fehlermeldung, die durch den Befehl DIR ausgegeben wird, wenn keine Datei gemäß der dritten Parameterzeichenfolge gefunden werden konnte.
Um die verwendeten Befehle und ihre Funktionsweise zu verstehen, öffnen Sie ein Eingabeaufforderungsfenster, führen Sie die folgenden Befehle aus und lesen Sie alle Hilfeseiten, die für jeden Befehl angezeigt werden, sorgfältig durch.
call /?
cscript /?
del /?
dir /?
echo /?
endlocal /?
exit /?
findstr /?
for /?
goto /?
if /?
move /?
rem /?
set /?
setlocal /?
Und auch die Microsoft-Artikel Using command redirection operators.
How can you find and replace text in a file using the Windows command-line environment?
:
Andere Lösungen für Text in einer Datei zu ersetzen Windows-Befehlszeile finden Sie unter