修改 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 上找到的两种方法中的一种,但到目前为止我还没有找到它们,部分原因是所有引号。
- 创建新文件但不更改行:
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
为您工作的环境创建一个版本的文件,并在每个文件的末尾添加 _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命令中的
<
和>
字符必须用^
转义
每次我在 Git 中切换分支时,我都必须更新一个 XML 文件中的一行,这样我就可以在本地看到我的图像(从图像服务器中提取)。我不想要一个永久的解决方案来更改文件(例如 gitignore),因为该文件会不时更改。
我想要 运行 一个批次,它只会改变这一行:
<add key="Images.RootUrl" value="//images.dev.foo.com:7000/" />
至
<add key="Images.RootUrl" value="//imagesperf.foo.com/" />
我正在尝试实施我在 SO 上找到的两种方法中的一种,但到目前为止我还没有找到它们,部分原因是所有引号。
- 创建新文件但不更改行:
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
为您工作的环境创建一个版本的文件,并在每个文件的末尾添加 _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命令中的
<
和>
字符必须用^
转义