Estoy intentando editar un archivo de configuración usando un script por lotes. Miré a mi alrededor y creo que powershell es el camino a seguir aquí. No tengo experiencia con Powershell, así que supongo que la sintaxis es lo que me está causando problemas.

Así es como se ve el archivo ahora (esta sección se encuentra en el medio del archivo)

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

Así es como quiero que se vea

    <!--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"/>

Esto es lo que intento hacer en mi archivo por lotes con el que necesito ayuda

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%"
0
user1984300 2 may. 2017 a las 18:22

3 respuestas

La mejor respuesta
$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

Así es como replicaría el archivo por lotes en todo Powershell, personalmente.

  1. La forma en que su comando Powershell reemplazó esperará RegEx y su patrón no coincidirá con la forma en que esperaba. Lo emparejaría como si fuera un patrón RegEx y no coincidiría con la cadena exacta como la escribió. Si usa el método de cadena .NET .Replace(), solo busca cadenas exactas.
  2. $textToAdd contiene el resultado final completamente formateado, incluida la cadena que estábamos buscando (tanto el resultado inicial como el final tienen la cadena, esto nos permite mantenerla allí), así como la suma concatenada. Según su descripción, el marcador de cadena se encuentra en el medio del registro, por lo que esto le permitirá realizar esas actualizaciones y volver a guardar el registro en su totalidad.
2
ferrell_io 9 may. 2017 a las 23:33

Desde la línea de comandos de PowerShell, esto funcionaría (suponiendo que sus contenidos existentes estén en 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'

Puede guardar esto como un script y ejecutarlo usando:

powershell.exe -File script.ps1
0
Robin 2 may. 2017 a las 15:37
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

Similar a la respuesta de Robin, solo otro script que podría ejecutar. Me golpeó hasta el golpe :)

0
Zoidburg 2 may. 2017 a las 15:59