我正在使用 powershell 获取大量不同的文档,在其中找到一个模式,然后用其他模式替换该模式。我已经成功了,但是我现在试图扩展其中一个正则表达式以覆盖多行,以便更准确,但我不知道该怎么做。
我正在尝试寻找域\用户名即在某个元素中,并将其替换为新域保持其后的用户名与原先相同。例如
<gMSA> <!--gManagedServiceAccount, can only be 15 Characters and needs to end with a '$'(Runs AppPool and Broker Services)--> DomainName\UserName </gMSA>
在 Notepad++ 中这是有效的:
寻找:
(\<gMSA>.*?\t)D.*?(\\.*?\</gMSA>)
代替:
$1NewDomain$2
但是这在 powershell 中不起作用。这就是我要用来替换文本的内容:
#Set Install set path
$ProfilePath = 'D:\Customers\Live'
#Update deployparameters in InstallSet Profiles
$DeployParam = Get-ChildItem $ProfilePath deployparameters.xml -rec
foreach ($file in $DeployParam)
{
(Get-Content $file.PSPath) |
Foreach-Object { $_ -replace '(<gMSA\>.*\t)D.*?(\\.*?</gMSA>)', '$1NewDomain$2' } |
Set-Content $file.PSPath
}
我尝试过一些方法,比如\s
让它*
跨越多行,但我并不高兴。
提前谢谢了。
答案1
嗯,有趣……
继续我的评论。
如果你确定该模式仅存在于传递的字符串中
$MyString = @"
<gMSA> <!--gManagedServiceAccount, can only be 15 Characters and needs to end with a '$'(Runs AppPool and Broker Services)-->
DomainName\UserName
</gMSA>
<gMSA> <!--gManagedServiceAccount, can only be 15 Characters and needs to end with a '$'(Runs AppPool and Broker Services)-->
DomainName\UserName
</gMSA>
<gMSA> <!--gManagedServiceAccount, can only be 15 Characters and needs to end with a '$'(Runs AppPool and Broker Services)-->
DomainName\UserName
</gMSA>
"@
那为什么不直接问呢?
[regex]::Matches($MyString, '(\w.*\\.*)')
# Results
<#
Groups : {0, 1}
Success : True
Name : 0
Captures : {0}
Index : 143
Length : 20
Value : DomainName\UserName
...
#>
[regex]::Matches($MyString, '(\w.*\\.*)').Value
# Results
<#
DomainName\UserName
DomainName\UserName
DomainName\UserName
#>
答案2
@TessellatingHeckler 给出了我需要的答案。这是我的解决方案,只需添加-Raw
和(?s)
#Set Install set path
$ProfilePath = 'D:\Customers\Live'
#Update deployparameters in InstallSet Profiles
$DeployParam = Get-ChildItem $ProfilePath deployparameters.xml -rec
foreach ($file in $DeployParam)
{
(Get-Content -Raw $file.PSPath) |
Foreach-Object { $_ -replace '(?s)(<gMSA\>.*\t)D.*?(\\.*?</gMSA>)', '$1NewDomain$2' } |
Set-Content $file.PSPath
}