使用PowerShell在Windows批处理文件中编辑文件

时间:2017-05-02 15:22:14

标签: windows powershell batch-file

我正在尝试使用批处理脚本编辑配置文件。我环顾四周,相信powershell是去这里的方式。我对powershell没有任何经验,因此我猜测语法是导致我出现问题的原因。

以下是文件现在的样子(此部分位于文件的中间)

    <!--add key="MinNumCycles" value="25"/-->
    <!--add key="MaxNumCycles" value="40"/-->

这就是我想要的样子

    <!--add key="MinNumCycles" value="25"/-->
    <!--add key="MaxNumCycles" value="40"/-->

    <!--RerunMode: 1 write to DB, 2 write to DB and add to RUN export/-->
    <add key="RerunMode" value="0"/>

以下是我在批处理文件中尝试做的事情,我需要帮助

SET pattern=<!--add key="MaxNumCycles" value="40"/-->
SET textToAdd1=<!--RerunMode: 1 write to DB, 2 write to DB and add to RUN export/-->
SET textToAdd2=<add key="RerunMode" value="0"/>
SET filename=Software.exe.config

powershell -Command "(gc %filename%) -replace "%pattern%", "$&`n`n%textToAdd1%"'n"%textToAdd2%" | sc %filename%"

3 个答案:

答案 0 :(得分:2)

$pattern='<!--add key="MaxNumCycles" value="40"/-->'
$textToAdd = $pattern + '

    <!--RerunMode: 1 write to DB, 2 write to DB and add to RUN export/-->
    <add key="RerunMode" value="0"/>'

$filename = "Software.exe.config"

([IO.File]::ReadAllText($filename).Replace($pattern,$textToAdd) | Set-Content $filename -Force

以下是我将如何在所有Powershell中个人复制批处理文件。

  1. 您的Powershell命令执行替换的方式将期望RegEx和您的模式与您预期的方式不匹配。它会匹配它,好像它是一个RegEx模式,并且不像你输入的那样匹配确切的字符串。如果使用.NET字符串方法.Replace(),它只查找完全字符串。
  2. $textToAdd包含完全格式化的最终结果,包括我们搜索的字符串(开头和结尾都有字符串,这允许我们将其保留在那里)以及连接的添加。根据您的描述,字符串标记位于日志的中间,因此这将允许它只进行这些更新并将日志重新保存在其中。

答案 1 :(得分:0)

从PowerShell命令行,这将起作用(假设您的现有内容位于conf.bat中):

$content = Get-Content -Path 'C:\path\to\Software.exe.config'
$content += "`r`n"
$content += '<!--RerunMode: 1 write to DB, 2 write to DB and add to RUN export/-->'
$content += '<add key="RerunMode" value="0"/>'
Set-Content -Value $content -Path 'C:\path\to\Software.exe.config'

您可以将其另存为脚本,并使用以下命令运行:

powershell.exe -File script.ps1

答案 2 :(得分:0)

SET $pattern= '<!--add key="MaxNumCycles" value="40"/-->'
SET $textToAdd1='<!--RerunMode: 1 write to DB, 2 write to DB and add to 
RUN export/-->'
SET $textToAdd2='<add key="RerunMode" value="0"/>'
SET $filename='Software.exe.config'

(Get-Content $filename) -replace pattern, '`n' $textToAdd1 '`n' $textToAdd2 | Set-Content $filename

与罗宾的回答类似,你可以运行另一个脚本。他打了我一拳:)