Ciclo sobre a lista

Preciso de um pedaço de código powershell para procurar e substituir um determinado texto dentro de um ficheiro de texto. No meu exemplo, quero substituir 23-06-2016 por 24-06-2016. O programa abaixo faz este trabalho:

$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

à medida que a mudança de texto de procura / substituição for alterada, quero repetir uma lista de datas que poderão ser assim:

$dates = @("23-06-2016","24-06-2016","27-06-2016")

tentei usar o

$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
}

numa primeira fase, a data "23-06-2016" deve ser substituída por "24-06-2016" e, numa segunda fase, a data "24-06-2016" deve ser substituído por "27-06-2016".

Como o meu guião não está a funcionar, estou à procura de conselhos.

Author: Phil U., 2016-10-12

1 answers

Você está usando $date Como sua variável de instância no seu laço foreach mas então referenciando-o como 'date', que é apenas uma cadeia de caracteres. Mesmo que tenha usado '$date', não funcionaria porque as cadeias de caracteres simples não expandem variáveis.

Além disso, $date não é um número, por isso date++ não faria nada mesmo que fosse referenciado como uma variável $date++. Além disso, $var++ devolve o valor original antes de aumentar, por isso estaria a referir-se à mesma data (ao contrário da versão do prefixo ++$var).

Em um loop foreach, não é muito prático se referir a outros elementos, na maioria dos casos.

Em vez disso, você poderia usar um laço for:

for ($i = 0; $i -lt $dates.Count ; $i++) {
    $find = $dates[$i]
    $rep = $dates[$i+1]
}
Esta não é necessariamente a maneira mais clara de o fazer.

Você poderia estar melhor com um [hashtable] que usa a data para encontrar como uma chave, e a data de substituição como o valor. Claro, Você estaria duplicando algumas datas como valor e chave, mas eu acho que eu prefiro ter a clareza:

$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
}
 2
Author: briantist, 2016-10-12 14:58:57