我的目标是能够使用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中的每一行,并且每行替换。我的其他内容将在哪里发生?
答案 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,它只是沿着未改变的方向传递该行并跳过日志记录。