2017-08-25 37 views
0

我需要將一個批處理文件女巫:批量檢查和替換字符串等待過程

  • 字符串user.cfg文件「g_language =俄羅斯」,並把它的內部檢查,如果發現 ,但如果蜇被設置爲「g_language =英語」,然後將其設置爲 「g_language =俄羅斯」

  • 等待some.exe啓動,在啓動時

  • 變化串「g_language =俄羅斯」到「 g_lan guage =英文「

我該怎麼做?

我用這個代碼,但我的結果是: 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

您可以通過研究並創建腳本來完成。如果一旦你創建了該腳本,它就無法按預期工作,那麼你可以在這裏返回一個正確的問題,顯示你已經完成了什麼,發生了什麼以及你的意圖是什麼。 – Compo

+0

我已經做了研究,一切我發現用原來因爲字符串包含'=' –

+0

你還是應該顯示這些努力,否則你的問題是:「我希望有人爲我工作的自由,而我並沒有努力」是無用的。 – Compo

回答

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

它只有在我用'pause'替換'Start「」some.exe Timeout/t 5'行時纔有效,但它會在文件末尾添加一個空白的新行,並使文件不可用。此外some.exe不應該從批處理啓動,但批處理應該等待some.exe啓動,因爲我必須從它的啓動程序運行它。 –

+0

我取代'開始 「」 some.exe 超時/噸5'與':搜索 TASKLIST | FIND 「Notepad.exe的」 IF%ERRORLEVEL%當量0(GOTO找到)ELSE%ERRORLEVEL%當量1(GOTO搜索) TIMEOUT/T 2 :found',它工作正常,但我得到空白的新行。如何解決它? –

0

繼承人已經給出的答案很大的替代。

我還沒有能夠測試這個,(請先在測試環境中試試),只有當您覺得您會從略有不同的方法中受益時纔會這樣做。

@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%" 

我做,這樣你只需要檢查/ 3調整上線的項目8

總體思路:

  • 如果沒有user.cfguser.bak存在,退出。
  • 如果只user.cfg一個或user.bak存在複製一個到另一個。
  • 如果user.cfguser.bak都存在,請將user.cfg複製到user.bak
  • 如果some.exe正在運行並且user.cfgg_language不是English將其更改爲English
  • 如果some.exe沒有運行,並且user.cfgg_language不是Russian將其更改爲Russian和運行some.exe

當然,如果user.cfg更改在some.exe重新啓動後纔會生效,則這些都不重要。

+0

我無法弄清楚如何修改你的代碼,因爲它調用some.exe來啓動,而不是等待進程啓動,因爲我必須從啓動它啓動它。 –

+0

只要從第17行刪除'\t \t開始「」「%fexe%」'並將2個括號移動到第16行不是爲您做的? – Compo

+0

我試過沒有結果 –