在ForEach-Object循环中编辑文本文件内容

问题描述 投票:0回答:1

我正在尝试在刷新目录后从PowerHhell编辑文本文件。

尝试从目标位置Get-Content来源dbconnecthost是我们正在寻找的。然后我们想要替换目标信息和Set-Content。这些变量是从另一个.ps1文件中提取的。

以下是我试图使用的内容。

function ReplaceDBhost {
    Get-Content ("$TargetLocation\Data\config.txt") | Foreach-Object {
        $_ -replace ('^dbconnecthost=' + '$SourceDBConnectHost'), ('dbconnecthost=' + '$TargetDBConnectHost' )
    } | Set-Content  ("$TargetLocation\Data\config.txt")
} 

问题是,当我运行它时,我没有得到任何改变。任何帮助是极大的赞赏。

powershell loops scripting
1个回答
4
投票

当您使用单引号时,它被称为字符串文字并且不支持变量扩展。要纠正这个问题,你需要使用双引号(如果你的变量是一个字符串并且你附加+,则根本没有引号):

(Get-Content -Path "$TargetLocation\Data\config.txt") |
    ForEach-Object {
        $_ -replace "^dbconnecthost=$SourceDBConnectHost", "dbconnecthost=$TargetDBConnectHost"
    } |
    Set-Content -Path "$TargetLocation\Data\config.txt"

虽然可以使用环视改进您的正则表达式:

"(?<=^dbconnecthost=)$SourceDBConnectHost", $TargetDBConnectHost

缩短:

$path = @{Path = "$TargetLocation\Data\config.txt"}
$pattern = "(?<=^dbconnecthost=)$SourceDBConnectHost"
(Get-Content @path) -replace $pattern, $TargetDBConnectHost | Set-Content @path
© www.soinside.com 2019 - 2024. All rights reserved.