我需要一段powershell-code来搜索和替换文本文件中的某个字符串。在我的例子中,我想用'24 -06-2016'替换23-06-2016'。下面的脚本完成了这项工作:
$original_file = 'file.old'
$destination_file = 'file.new'
(Get-Content $original_file) | Foreach-Object {
$_ -replace '23-06-2016', '24-06-2016' `
} | Out-File -encoding default $destination_file
当搜索/替换字符串更改时,我想循环遍历可能如下所示的日期数组:
$dates = @("23-06-2016","24-06-2016","27-06-2016")
我尝试使用
$original_file = 'file.old'
$destination_file = 'file.new'
foreach ($date in $dates) {
(Get-Content $original_file) | Foreach-Object {
$_ -replace 'date', 'date++' `
} | Out-File -encoding default $destination_file
}
第一步,日期'23 -06-2016'应替换为'24 -06-2016',第二步,日期'24 -06-2016'应替换为'27 - 06-2016' 。
由于我的剧本不起作用,我正在寻求一些建议。
答案 0 :(得分:6)
您在$date
循环中使用foreach
作为实例变量,但后来将其引用为'date'
,这只是一个字符串。即使你使用'$date'
它也行不通,因为单引号字符串不会扩展变量。
此外,$date
不是数字,因此date++
即使被引用为变量$date++
也不会执行任何操作。更进一步,$var++
在递增之前返回原始值,因此您将引用相同的日期(而不是前缀版本++$var
)。
在foreach
循环中,在大多数情况下引用其他元素并不实际。
相反,您可以使用for
循环:
for ($i = 0; $i -lt $dates.Count ; $i++) {
$find = $dates[$i]
$rep = $dates[$i+1]
}
这不一定是最明确的方法。
使用[hashtable]
使用日期作为键,并将替换日期作为值,您可能会更好。当然,你要复制一些日期作为价值和关键,但我认为我宁愿有清晰度:
$dates = @{
"23-06-2016" = "24-06-2016"
"24-06-2016" = "27-06-2016"
}
foreach ($pair in $dates.GetEnumerator()) {
(Get-Content $original_file) | Foreach-Object {
$_ -replace $pair.Key, $pair.Value
} | Out-File -encoding default $destination_file
}