2017-08-25 1 views
0

ich eine Batch-Datei Hexe benötigen:Batch-Prüfung und ersetzen Zeichenfolge dann für einen Prozess warten

  • Prüfung innerhalb user.cfg Datei für string „g_language = Russisch“ und es verlassen, wenn es findet aber wenn Stachel ist auf „g_language = Englisch“ dann auf „g_language Russisch =“

  • warten auf some.exe und zu starten, wenn es gestartet wird

  • Änderung string „g_language = Russisch“ auf " g_lan guage = Englisch "

Wie kann ich das tun?

habe ich diesen Code, aber mein Ergebnis ist: Russian=g_language = English= Russian

@echo off &setlocal 
set "search=g_language = Russian" 
set "replace=g_language = English" 
set "textfile=user.cfg" 
set "newfile=user.bak" 
(for /f "delims=" %%i in (%textfile%) do (
set "line=%%i" 
setlocal enabledelayedexpansion 
set "line=!line:%search%=%replace%!" 
echo(!line! 
endlocal 
))>"%newfile%" 
del %textfile% 
rename %newfile% %textfile%` 
+1

Sie können es tun, indem Sie ein Skript recherchieren und dann erstellen. Wenn Sie dieses Skript erst einmal erstellt haben, funktioniert es nicht wie vorgesehen. Dann können Sie hier mit einer richtig formulierten Frage zurückkommen, die zeigt, was Sie getan haben, was passiert ist und was Ihre Absicht war. – Compo

+0

Ich habe bereits recherchiert und alles, was ich gefunden und benutzt habe, erweist sich als nutzlos, da string '' '' –

+0

enthält. Sie sollten diese Bemühungen immer noch zeigen, sonst ist Ihre Frage "Ich möchte, dass jemand kostenlos für mich arbeitet". – Compo

Antwort

0
@echo off &setlocal 
set "Russian=g_language = Russian" 
set "English=g_language = English" 

set "textfile=user.cfg" 
set "newfile=user.bak" 

Call :SwapLang Russian 

Start "" some.exe 
Timeout /t 5 

Call :SwapLang English 

Goto :Eof 

:SwapLang %1 byRef 
(for /f "delims=" %%i in (%textfile%) do (
    set "line=%%i" 
    setlocal EnableDelayedExpansion 
    If /I "!line:~0,12!" Equ "g_language =" (
    echo(!%1! 
) Else (
    echo(!line! 
) 
    endlocal 
)) > "%newfile%" 
del %textfile% 
rename %newfile% %textfile% 
Goto :Eof 
+0

Es funktioniert nur, wenn ich Linien "Start" "some.exe Timeout/t 5' mit 'Pause 'ersetze, aber es fügt eine leere neue Zeile am Ende der Datei hinzu und macht eine Datei nicht verwendbar. Außerdem sollte some.exe nicht von Batch gestartet werden, aber Batch sollte auf den Start von some.exe warten, da ich es von seinem Launcher starten muss. –

+0

Ich ersetzte "Start" "some.exe Timeout/t 5' mit': Suche TASKLIST | FIND "notepad.exe" IF% ERRORLEVEL% eq 0 (GOTO gefunden) ELSE% ERRORLEVEL% eql 1 (Suche GOTO) TIMEOUT/T 2 : gefunden und es funktioniert gut, aber ich bekomme leere neue Zeile. Wie man es löst? –

0

Heres eine Alternative zu der großen Antwort bereits gegeben.

Ich konnte dies nicht testen, (bitte versuchen Sie es in einer Testumgebung zuerst), und nur dann, wenn Sie das Gefühl haben, Sie würden von der etwas anderen Ansatz profitieren.

@Echo Off 

Set "fexe=some.exe" 
Set "fcfg=user.cfg" 
Set "fbak=user.bak" 
Set "sstr=g_language" 
Set "rlng=Russian" 
Set "elng=English" 

If Exist "%fbak%" (If Not Exist "%fcfg%" (Copy "%fbak%" "%fcfg%" 
) Else Copy "%fcfg%" "%fbak%") Else If Exist "%fcfg%" (Copy "%fcfg%" "%fbak%" 
) Else Exit/B 

QProcess "%fexe%">Nul 2>&1 &&(FindStr/IC:"%sstr% = %elng%" "%fbak%">Nul||(
     Call :Sub "%rlng%" "%elng%"))||(
    FindStr/IC:"%sstr% = %rlng%" "%fbak%">Nul||(Call :Sub "%elng%" "%rlng%" 
     Start "" "%fexe%")) 

Exit/B 

:Sub 
(For /F Delims^= %%A In ('FindStr $ "%fbak%"') Do If /I "%%A"=="%sstr% = %~1" (
    Echo %sstr% = %~2) Else Echo %%A)>"%fcfg%" 

ich es gemacht haben, so dass Sie sollten nur prüfen müssen/justieren Sie die Punkte auf Linien 3-8.

Die allgemeine Idee:

  • Wenn weder user.cfg und user.bak vorhanden ist, zu verlassen.
  • Wenn nur einer von user.cfg oder user.bak existiert, kopieren Sie einen zum anderen.
  • Wenn sowohl user.cfg als auch user.bak vorhanden sind, kopieren Sie user.cfg in user.bak.
  • Wenn some.exe läuft und user.cfg 's g_language ist nicht English ändern Sie es zu English.
  • Wenn some.exe nicht läuft und user.cfg ‚s g_language ist nicht Russian Änderung es Russian und some.exe laufen.

Natürlich nichts davon zählt, wenn user.cfg Änderungen wirksam nicht dauern, bis some.exe neu gestartet wird.

+0

Ich kann es nicht herausfinden, wie Sie Ihren Code ändern, weil er some.exe aufruft, um stattdessen zu starten, damit der Prozess gestartet wird, weil ich ihn vom Launcher starten muss. –

+0

Würde nur entfernen '\t \t Starten Sie" ""% fexe% "' aus Zeile 17 und verschieben Sie die 2 Klammern bis Zeile 16 nicht das für Sie tun? – Compo

+0

Ich habe das ohne Ergebnis versucht –

Verwandte Themen