在 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,它会原封不动地传递该行并跳过日志记录。
我的目标是能够在 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,它会原封不动地传递该行并跳过日志记录。