在 powershell 字符串查找和替换期间记录

Logging during powershell string find and replace

我的目标是能够在 powershell 中使用 find/replace 脚本记录我正在更改的内容。

这适用于替换:

$Content | ForEach-Object {$_ -Replace $oldIP2, $newIP} | Set-Content $file.PSPath

但是,如果我添加一个 if 语句以便我可以向日志中添加一些内容,-replace 会清空文件,但替换除外。

$Content | ForEach-Object {
        if($_ -match $oldIP1) { 
                #logging stuff would go here
                $_ -Replace $oldIP1, $newIP
        }
    } | Set-Content $file.PSPath

这样的文件:

1.1.1.1 ($oldIP1)

asd asd asd asd

asd

转为

123.123.123.123 ($newIP)

我的理解是 $_ 成为 $Content 中的每一行,并逐行替换。我的其他内容去哪儿了?

问题是您将其他内容转储到 ForEach 循环中。

让我们按您的管道部分进行分解。在您的示例中,它读取第一行,并将其传递给 ForEach 循环。也就是说,如果它匹配 $oldIP1 变量,那么它将 $oldIP1 字符串替换为 $newIP 字符串。它通过管道传递给 Set-Content,它收集字符串,并等待来自管道的其余信息。

现在它移动到第二行,并将其传递给 ForEach 循环,该循环检查该行是否与 $oldIP1 变量匹配。它不匹配,所以 ForEach 行什么都不做。它不会向下传递数据,它什么都不做。

接下来它将第三行发送到 ForEach 循环,它再次检查它是否与 $oldIP1 变量匹配,但它不匹配,所以它再次什么都不做。

唯一传递给 Set-Content cmdlet 的是与 If 语句中的限定语句相匹配的第一行。就写这么多了

现在,-replace 只会替换找到的文本,所以 If 语句没有用,因为如果它在当前位置找不到 $oldIP1行,它不能替换它,它只是将文本原封不动地沿着管道传递下去。删除 If,您将获得预期的输出。或者改成:

if($_ -match $oldIP1) { 
            #logging stuff would go here
            $_ -Replace $oldIP1, $newIP
    }Else{$_}

这样,如果它没有在该行中找到 IP,它会原封不动地传递该行并跳过日志记录。