2015-06-12 71 views
0

每次我在Git中切換分支時,我必須在一個XML文件中更新一行,以便在本地看到我的圖像(從圖像服務器拉出)。我不想要一個永久的解決方案來更改文件(如gitignore),因爲該文件會不時發生變化。在web.config中修改一個元素

我想運行一個批處理,將簡單地改變這一行:

<add key="Images.RootUrl" value="//images.dev.foo.com:7000/" />

<add key="Images.RootUrl" value="//imagesperf.foo.com/" />

我想實現兩個方法之一我已經在這裏發現,但迄今爲止,他們逃避我,部分是因爲所有的報價。

  1. 創造了新的文件,但不改變行:

cd c:\Projects\Git\foo\Foo.Web.Store FINDSTR /I /V /B "Images.RootUrl" Web.config > config.new ECHO <add key="Images.RootUrl" value="//imagesperf.foo.com/" /> >> config.new REM DEL Web.config REM REN Web.new Web.config PAUSE

  • 敢肯定我失去了情節約一半:
  • cd c:\Projects\Git\foo\Foo.Web.Store for %%f in (Web.config) do ( for /f "tokens=1* delims=:" %%g in ('type "%%f" ^| findstr /n /v "images.dev.foo.com:7000"') do ( if "%%hx"=="x" ( echo.>>"tempWeb.config" ) else ( for /f "tokens=1* delims==" %%i in ('echo.%%h') do ( if "%%i"=="images.dev.foo.com:7000" ( echo.%%i=%%jimagesperf.foo.com>>"tempWeb.config" ) else ( if "%%jx"=="x" ( echo.%%i>>"tempWeb.config" ) else ( echo.%%i=%%j>>"tempWeb.config" ) ) ) ) ) ) REM ren Web.config oldWeb.config REM ren tempWeb.config Web.config

    +0

    轉義爲什麼不使用的處理是這樣的一個簡單的微創治療方法。因爲這是iis/asp.net爲什麼不使用內置的功能爲不同的環境配置不同的配置? HTTP://計算器。com/questions/305447/using-different-web-config-in-development-and-production-environment –

    +0

    如果一個值發生變化,我會在不知情的情況下進行修改,它會通過裂縫漏掉,而不會在我的開發配置中結束。 – DaveC426913

    +0

    轉換是部分的。您不需要爲每個環境重新生成整個文件。 –

    回答

    0

    此批處理文件做你想要什麼:

    @echo off 
    setlocal EnableDelayedExpansion 
    
    set "replace=<add key="Images.RootUrl" value="//imagesperf.foo.com/" />" 
    
    rem Get the number of the target line minus one 
    for /F "delims=:" %%a in ('findstr /I /N "Images.RootUrl" Web.config') do set /A lines=%%a-1 
    
    rem Redirect the input file to read it via SET /P 
    < Web.config (
    
        rem Copy lines before the target one 
        for /L %%i in (1,1,%lines%) do (
         set "line=" 
         set /P "line=" 
         echo/!line! 
        ) 
    
        rem Read the target line and replace it 
        set /P "line=" 
        echo !replace! 
    
        rem Copy the rest of lines 
        findstr "^" 
    
    rem Store the output in a temporary file 
    ) > Web.new 
    
    move /Y Web.new Web.config 
    

    但是,如果線的換成不必在比原來的同一個地方,那麼你的第一個方法應該工作;你只需要兩個小錯誤:

    FINDSTR /I /V "Images.RootUrl" Web.config > config.new 
    ECHO ^<add key="Images.RootUrl" value="//imagesperf.foo.com/" /^> >> config.new 
    REM DEL Web.config 
    REM REN Web.new Web.config 
    PAUSE 
    
    • 中FINDSTR/B開關查找字符串在該行的開頭!
    • 在ECHO命令<>字符必須與^
    +0

    謝謝。隨着'cd \ myDir'的添加,第一個解決方案可以完美工作! – DaveC426913

    0

    創建文件的一個版本爲你工作的環境添加_ENVNAME在每個文件的末尾。設置.gitignore忽略.xml文件。然後,適當地鏈接每個環境中的.xml文件。

    例如:

    some.xml_LOCAL 
    some.xml_STAGING 
    some.xml_PRODUCTION 
    

    在本地:

    ln -s some.xml_LOCAL some.xml 
    

    在的.gitignore

    /some.xml 
    

    爲了安全起見,你可能還需要從混帳刪除some.xml。

    最後,爲他人記錄它。

    +0

    因爲我必須觀察對該文件的更改,然後更新每個其他文件。 – DaveC426913