循环数组

时间:2016-10-12 14:03:27

标签: powershell

我需要一段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' 。

由于我的剧本不起作用,我正在寻求一些建议。

1 个答案:

答案 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
}