2013-05-09 54 views
1

這裏的config文件的某些部分,我有編輯config文件:是否可以使用批處理腳本

<cs.components> 
      <clear/> 
      <cs.component name="Security"/> 
      <cs.configitems> 
       <cs.configitem name="sql.server.name" value="some_name" type="String" description=""/> 
       <cs.configitem name="sql.server.database" value="DB_name" type="String" description=""/> 
       <cs.configitem name="sql.user" value="user_name" type="String" description=""/> 
       <cs.configitem name="sql.pass" value="pass" type="String" description=""/> 
    </cs.components> 

所以基本上我想有相應的名稱* * some_name編輯文件=服務器1; DB_name =服務器1上的真實數據庫等等...... 任何幫助將不勝感激!

+0

在哪裏輸入來自哪裏?含義some_name和DB_name定義在哪裏?假設有多個配置文件,否則你不需要編寫腳本。任何帶查找/替換的文本編輯器就足夠了。 – 2013-05-09 15:15:17

+0

爲了進行文本編輯,需要非常非常好地討論批處理文件。他們確實不喜歡這樣做。是否可能取決於很多事情。需要更多的細節,幾乎所有的方法都會遇到一些問題。就此而言,這些數據都在一條線上嗎?線路長度有8K的限制。代替某些字符可能是一個問題。可以將文件格式化爲多行 - 可能要修改的模板? – Magoo 2013-05-09 15:32:34

+0

你想在什麼位置添加實名? 'description'後面? – Endoro 2013-05-09 17:38:38

回答

0

這是我的FindandReplace.cmd腳本。它使用VBScript來克服批量施加的限制。像這樣稱呼它FindAndReplace <searchstring> <replacestring> <filename or Wildcard>它是區分大小寫的。你讓批處理文件後,你會這樣稱呼它:

FindAndReplace some_name some_new_name *.config 
    FindAndReplace DB_name DB_new_name *.config 


::FindAndReplace.cmd 
@echo off 
for /f "tokens=*" %%a in ('dir %~3 /b /a-d /on') do (
pushd %~dp0 
if not exist _.vbs goto :MakeReplace 
<%%a cscript /nologo _.vbs "%~1" "%~2" "%~3">new.txt 
move /Y new.txt %%~nxa > NUL 
popd 
) 
del _.vbs 
goto :eof 

:MakeReplace 
>_.vbs echo Wscript.StdOut.Write Replace(WScript.StdIn.ReadAll,Wscript.arguments(0), Wscript.arguments(1)) 
2

下面的批處理文件是程序的初步版本,實現你想要的。輸入和輸出文件的名稱在程序中是硬編碼的,但是可以改變它們以在參數中給出它們或自動處理由通配符選擇的所有文件。該程序刪除空行並在文件中包含驚歎號時失敗,但如果需要,這些限制可能會被修復。

@echo off 
setlocal EnableDelayedExpansion 

rem Save replacement strings 
set i=0 
:nextParam 
    if "%~1" equ "" goto endParams 
    set /A i+=1 
    set "replace[!i!]=%~1" 
    shift 
goto nextParam 
:endParams 

rem Process the file 
(for /F "delims=" %%a in (input.txt) do (
    set "line=%%a" 
    for /L %%i in (1,1,%i%) do (
     for /F "delims=" %%r in ("!replace[%%i]!") do (
     set "line=!line:%%r!" 
    ) 
    ) 
    echo !line! 
)) > output.txt 

要使用此程序,請將用引號括起來的替換字符串作爲參數。例如:

replace.bat "some_name=server 1" "DB_name=A real database on Server 1" 

輸出:

<cs.components> 
      <clear/> 
      <cs.component name="Security"/> 
      <cs.configitems> 
       <cs.configitem name="sql.server.name" value="server 1" type="String" description=""/> 
       <cs.configitem name="sql.server.database" value="A real database on Server 1" type="String" description=""/> 
       <cs.configitem name="sql.user" value="user_name" type="String" description=""/> 
       <cs.configitem name="sql.pass" value="pass" type="String" description=""/> 
    </cs.components> 
+0

+1,很好的代碼和有用的。 – Endoro 2013-05-09 21:12:15

+0

那麼首先真的是10倍你:)但當我嘗試它,它發生我,我不會知道「值」...所以有任何其他選項,我第一次找到「sql.server.name」和那麼我設置它的價值,因爲在大多數情況下,我將使用它,我不會知道它的文件是什麼...我真的很感謝,如果有另一種方式去做... – user2366775 2013-05-10 07:55:41

+0

我不理解。你想改變一個你不知道它是什麼的價值嗎?也許如果你解決你的問題,我們可能會寫一個程序來解決你的問題,但是不要問我們你的問題是什麼! – Aacini 2013-05-11 22:46:23