【问题标题】:Edit text file content in ForEach-Object loop在 ForEach-Object 循环中编辑文本文件内容
【发布时间】:2019-02-21 20:57:56
【问题描述】:

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

尝试从源dbconnecthost 是我们正在搜索的目标位置Get-Content。 然后我们要替换为目标信息和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】:

    当您使用单引号时,这称为字符串literal,不支持变量扩展。要更正此问题,您需要使用双引号(如果您的变量是字符串并且附加 +,则根本不使用引号):

    (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
    

    【讨论】:

    • @LotPings 很好 - 或将-Raw 与多行正则表达式选项一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    • 1970-01-01
    • 2015-07-25
    • 2014-09-26
    • 1970-01-01
    • 2014-02-19
    • 2010-12-04
    相关资源
    最近更新 更多