修改 web.config 中的元素

modify an element in web.config

每次我在 Git 中切换分支时,我都必须更新一个 XML 文件中的一行,这样我就可以在本地看到我的图像(从图像服务器中提取)。我不想要一个永久的解决方案来更改文件(例如 gitignore),因为该文件会不时更改。

我想要 运行 一个批次,它只会改变这一行:

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

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

我正在尝试实施我在 SO 上找到的两种方法中的一种,但到目前为止我还没有找到它们,部分原因是所有引号。

  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

  1. 很确定我在中途丢失了情节:

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

为您工作的环境创建一个版本的文件,并在每个文件的末尾添加 _ENVNAME。设置 .gitignore 以忽略 .xml 文件。然后,根据需要在每个环境中对 .xml 文件进行符号链接。

例如:

some.xml_LOCAL
some.xml_STAGING
some.xml_PRODUCTION

本地:

ln -s some.xml_LOCAL some.xml

在.git忽略

/some.xml

为了安全起见,您可能还想从 git 中删除 some.xml。

最后,为其他人记录下来。

这个批处理文件做你想做的事:

@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命令中的<>字符必须用^
  • 转义