【问题标题】:Replacing key-value pair in app.config using a batch file [closed]使用批处理文件替换 app.config 中的键值对 [关闭]
【发布时间】:2016-08-07 01:25:10
【问题描述】:

我有一个 app.config,看起来像这样:

   <!-- Device Configuration goes here --> 
         <DinoConfig Alpha="aaa" Beta="bbb" Gamma="ccc" Theta="">
      <Dino Zeta="ooo" Delta="hhh" Tau="rrr" Rho="ddd" />
    </DinoConfig>

现在我想使用批处理文件在 DinoConfig 父节点中将 Beta 更改为“yyy”,将 Gamma 更改为“zzz”。我也想更改子节点(Dino)中的键值对。

我目前使用批处理脚本的方式:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "string=^<DinoConfig Alpha="nnn" Beta="mmm" Gamma="iii" Theta=""^>"
set "dir=%temp%" & set "file=Dino.config" & pushd "!dir!"
for /f "tokens=*" %%G in (%file%) do (set cstring=%%G
    if "!cstring:~6,8!"=="Beta" set "cstring=%%G"
    echo "!cstring!" | findstr /r /b /c:".*jjj.*" >nul 2>&1 && echo %string% || if defined cstring echo !cstring!
) >> %file:.config=_mod.config%
del %file% & ren %file:.config=_mod.config% %file% & popd
exit /b

使用它我正在更改 Beta="bbb" 并且在下一次迭代中我正在更改 ="vvv"(如果我可以同时更改两者会很方便)。

【问题讨论】:

  • 你能告诉我我怎样才能做到这一点。
  • 1. SO 不是免费的代码编写服务,因此如果您需要帮助,您需要自己尝试,分享您的努力并准确描述您遇到的问题;请学习how to ask; 2. 要处理 XML 数据,您应该使用本机支持该格式的东西;批处理脚本只能处理文本文件;将 XML 视为普通文本并非易事,而且对于数据被破坏也非常危险......
  • 我对 SO 并不陌生,之前已经发布过问题。我知道如何编码,所以我只想要这种方法。那就足够了。根据您的要求,我正在更新上面的问题。我必须说我不太喜欢批处理编程,但我知道我的东西。谢谢,如果您愿意,请帮助我。

标签: batch-file batch-processing


【解决方案1】:

下面的脚本很适合我。将 dirfile 值替换为您自己的值,目标 file 保存在 dir 中,批处理文件可以从不同的文件夹:

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "string=    ^<Dino DinoName="mmm" Key1="nnn" Key2="pqr" Key3="stu" /^>"
set "dir=%temp%" & set "file=app.txt" & pushd "!dir!"
for /f "tokens=*" %%G in (%file%) do (set cstring=%%G
    if "!cstring:~6,8!"=="DinoName" set "cstring=    %%G"
    echo "!cstring!" | findstr /r /b /c:".*jkl.*" >nul 2>&1 && echo %string% || if defined cstring echo !cstring!
) >> %file:.txt=_mod.txt%
del %file% & ren %file:.txt=_mod.txt% %file% & popd
exit /b

输出到文件:

<DinoConfig Key1="abc" Key2="def" Key3="ghi" >
    <Dino DinoName="mmm" Key1="nnn" Key2="pqr" Key3="stu" /> 
    <Dino DinoName="vww" Key1="xyz" Key2="aaa" Key3="bbb" />
</DinoConfig>

或者,您可以修改并尝试您在问题中发布的脚本 sn-p:

setlocal enabledelayedexpansion
for /f "tokens=*" %%i in ('findstr...

【讨论】:

  • 您好,感谢您发布答案 :)。我尝试了您的代码,但它创建的新文件“app.config_mod”是一个空文件。并从 app.config_mod 重命名为 app.config 它在 ren 命令之前的 & 运算符处遇到语法错误。
  • 修复了ren命令的问题。看起来您无法为 file2 ren {path}/FileName newFileName 指定完全限定的路径
  • 出于格式化原因,我在问题块中添加了输出。如果任何事情对我来说看起来不错,但它会产生一个空白的 app.config 文件,请告诉我你是否能找到错误。
  • 我试过这样做,但仍然产生空文件。 set "string="" 你的脚本对我来说看起来不错,但我不知道为什么它会产生空 app_mod .config 文件
  • 脚本假定,您的批次与所有其他批次位于一个单独的目录中,您可以从其中启动它。如果您有批量收集,这是有道理的。但是您使用的文件(如 %file%)放在 %temp% 或您喜欢的任何其他目录中。如果将所有文件保存在批处理目录中,则不需要 pushdpopd 命令,因为它们会将 dir 更改为 %dir% 并恢复。
【解决方案2】:

对我有用的代码:

@echo off &setlocal
set "search=jkl"
set "replace=mmm"
(for /f "delims=" %%i in ('findstr "^" "%""C:\App.config""%"') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%search%=%replace%!"
    echo(!line!
    endlocal
))>"%""C:\NewApp.Config""%"
del c:\App.config & ren c:\NewApp.config App.config
set "search=mno"
set "replace=nnn"
(for /f "delims=" %%i in ('findstr "^" "%""C:\App.Config""%"') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%search%=%replace%!"
    echo(!line!
    endlocal
))>"%""C:\NewApp.Config""%"
del c:\App.config & ren c:\NewApp.config App.config

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-06
    • 2021-10-14
    • 2018-04-16
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    相关资源
    最近更新 更多