2016-11-18 116 views
9

我想读取使用PowerShell替换配置文件中的一行。有时候这个脚本可以工作,但大多数时候它并不能取代这条线。如何使用PowerShell替换文件中的某一行?

(Get-Content D:\home\App_Config\Sitecore.config) ` 
    | %{ $_ -replace ' <setting name="Media.MediaLinkServerUrl" value=" "/>',' <setting name="Media.MediaLinkServerUrl" value="https://newurl.com"/>'} ` 
    | Set-Content D:\home\App_Config\Sitecore.config 

回答

6

尝试以下操作:

$file = 'D:\home\App_Config\Sitecore.config' 
$regex = '(?<=<setting name="Media\.MediaLinkServerUrl" value=")[^"]*' 
(Get-Content $file) -replace $regex, 'https://newurl.com' | Set-Content $file 

Set-Content的说明:默认情况下它使用系统的旧的单字节字符编码,因此您可能想要使用-Encoding明确控制输出文件的编码。
还请注意所需的(...)围绕Get-Content调用,以确保管道可以回写到Get-Content已读取的文件。

由于使用正则表达式来匹配您的现有设置,任何目前内部value="..."文本匹配,如此反复运行此命令时,会甚至工作。

你的命令中使用的有效文字... value=" ")来查找替换,和之后的第一次 - 成功 - 运行,即字面不再匹配,和后续运行失败。

@neha自从在每次运行之前声明值为手动重置,因此问题中代码间歇性故障的原因仍然未知。但是,这里介绍的解决方案似乎工作。

上面的命令使用一个简化的方法来替代:

  • (?<=<setting name="Media.MediaLinkServerUrl" value=")是向后看断言((?<=...))匹配,但没有抓住它匹配的:它找到的部分达并包括您想要替换的值的开头",而不会将该前缀部分替换为所要替换的内容。

  • [^"]*然后匹配整个值,直到但不包括关闭"。 ([^"]是比"任何字符其他^)相匹配的字符集,并且*发现这样的字符的任何(可能是空的)序列。

  • 因此,由于正则表达式捕获仅值本身,所有你需要指定的替换字符串是新值。

9

使用替换操作是这样的:

$file = 'D:\home\App_Config\Sitecore.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 
+0

不好意思,找出关键字? –

+0

很抱歉的打字错误。可能是我写的所有在一行,这就是为什么它是工作间歇。 – neha

+0

' .Replace()'是.NET类型'[string]'的_method_,而不是一个_operator_。与PowerShell使用正则表达式的'-replace'运算符不同,'.Replace()'执行_literal_子字符串替换,我怀疑这可能是neha的问题:在初始(成功)运行脚本之后,文本不再匹配。 – mklement0

相关问题