Solución:
Intente lo siguiente:
$file="D:homeApp_ConfigSitecore.config"
$regex = '(?<=<setting name="Media.MediaLinkServerUrl" value=")[^"]*'
(Get-Content $file) -replace $regex, 'https://newurl.com' | Set-Content $file
* Re Set-Content
: En Windows PowerShell utiliza la codificación de caracteres de un byte heredada de su sistema de forma predeterminada (según la página de códigos ANSI activa), por lo que es posible que desee utilizar -Encoding
para controlar la codificación del archivo de salida explícitamente; Potencia Shell [Core] 6+ por defecto es UTF-8 sin BOM.
* También tenga en cuenta los requisitos (...)
alrededor de Get-Content
llamar para asegurarse de que la canalización pueda volver a escribir en el mismo archivo que Get-Content
ha leído.
* Si existe la posibilidad de que la etiqueta de apertura en cuestión (<setting ...>
) se extiende varias líneas, usar
Get-Content -Raw $file
(PSv3 +) para leer todo el contenido del archivo como una sola cuerda (gracias, perro mortal);
sin -Raw
, Get-Content
devuelve un formación de cadenas, que representan la entrada líneas.
Debido al uso de una expresión regular para que coincida con su configuración existente, alguna texto actualmente dentro value="..."
coincide, por lo que este comando funcionará incluso cuando se ejecute repetidamente.
Por el contrario, lo que intentaste usa un efectivo literal (... value=" "
) para encontrar qué reemplazar y, después de la primera ejecución (exitosa), ese literal ya no coincide y las ejecuciones posteriores fallan.
El comando anterior utiliza un enfoque simplificado para el reemplazo:
-
(?<=<setting name="Media.MediaLinkServerUrl" value=")
es una afirmación retrospectiva(?<=...)
) que coincide, pero no captura lo que coincide: encuentra la parte hasta e incluyendo la apertura"
del valor que está intentando reemplazar, sin que ese prefijo forme parte de lo que se reemplazará. -
[^"]*
luego coincide con el valor completo, hasta, pero sin incluir el cierre"
. ([^"]
es un conjunto de caracteres que coincide con cualquier carácter otro que (^
) a"
, y*
encuentra cualquier secuencia (posiblemente vacía) de tales caracteres. -
Por lo tanto, debido a que la expresión regular capturó solo el valor en sí, todo lo que necesita especificar como cadena de reemplazo es el nuevo valor.
Utilice el método Reemplazar como este:
$file="D:homeApp_ConfigSitecore.config"
$find = ' <setting name="Media.MediaLinkServerUrl" value=" "/>'
$replace=" <setting name="Media.MediaLinkServerUrl" value="https://newurl.com"/>"
(Get-Content $file).replace($find, $replace) | Set-Content $file