我有一个包含与
类似的文本文件 Settings amount ="01:00:00"
我知道如何更换线路,但我的问题是,如果我知道线路的确切内容,我只能更换整条线路 - 使用-match
和-replace
。但是,有没有办法可以只搜索Settings amount =
,然后用我的新设置替换整行?这样,无论当前值是什么,我都有能力扫描并给它一个不同的值。
这就是我目前所拥有的。
$DesiredTime = 'Settings amount="06:00:00" />'
$path = "C:\Windows\File.txt"
(Get-Content $path) -replace 'Settings amount="01:00:00" />', $DesiredTime | out-file $path
有什么想法吗?
答案 0 :(得分:5)
看看Select-String。它将允许您查找包含您要查找的内容的整个行。然后你可以更新该行。
这是一个示例文件
apple = yummy
bananna = yummy
pear = awful
grapes = divine
说我想替换包含" pear"的行。首先得到一句话:
$line = Get-Content c:\temp\test.txt | Select-String pear | Select-Object -ExpandProperty Line
现在我们只需阅读内容并用我们的行替换该行:
$content = Get-Content c:\temp\test.txt
$content | ForEach-Object {$_ -replace $line,"pear = amazing"} | Set-Content c:\temp\test.txt
确认更改
Get-Content C:\temp\test.txt
apple = yummy
bananna = yummy
pear = amazing
grapes = divine
请注意,如果您正在使用XML,您可能会将该文档作为XML文档打开,只需替换该属性即可。如果没有看到源文件的样本,很难说清楚。
答案 1 :(得分:3)
感谢您的代码。效果很好,但只想补充一点,如果根本找不到该字符串,这将变得很糟糕。它将替换文件中的每一行。这通过检查null来解决我的问题:
$line = Get-Content c:\temp\test.txt | Select-String pear | Select-Object -ExpandProperty Line
if ($line -eq $null) {
"String Not Found"
exit
} else {
$content = Get-Content c:\temp\test.txt
$content | ForEach-Object {$_ -replace $line,"pear = amazing"} | Set-Content c:\temp\test.txt
}