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

时间:2015-07-08 18:30:24

标签: powershell replace find

我的目标是能够使用powershell中的查找/替换脚本记录我正在更改的内容。

这适用于替换:

$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中的每一行,并且每行替换。我的其他内容将在哪里发生?

1 个答案:

答案 0 :(得分:1)

问题是您是在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,它只是沿着未改变的方向传递该行并跳过日志记录。