2016-08-29 3 views
0

ich das unten stehende Skript bin mit einem Text in XML zu finden und ersetzenAusführen eines Fledermaus-Befehl nach Suchen und Ersetzen Skript

setlocal 

call :FindReplace "#fromconfig#" "oldtest" new-text 

:FindReplace <findstr> <replstr> <file> 
set tmp="%temp%\tmp.xml" 
If not exist %temp%\_.vbs call :MakeReplace 
for /f "tokens=*" %%a in ('dir "%3" /s /b /a-d /on') do (
    for /f "usebackq" %%b in (`Findstr /mic:"%~1" "%%a"`) do (
    echo(&Echo Replacing "%~1" with "%~2" in file %%~nxa 
    <%%a cscript //nologo %temp%\_.vbs "%~1" "%~2">%tmp% 
    if exist %tmp% move /Y %tmp% "%%~dpnxa">nul 

) 
) 

del %temp%\_.vbs 

: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 

ich auch ein paar Befehle haben nach diesem Teil laufen, aber die Batch-Datei tritt nach dem Ausführen des obigen Teils aus.

Können Sie mir irgendeinen Weg vorschlagen, das Skript nach dem obigen Teil fortzusetzen?

Antwort

2

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