2016-10-12 3 views
2

Мне нужен кусок powershell-кода для поиска и замены определенной строки внутри текстового файла. В моем примере я хочу заменить 23-06-2016 'на '24 -06-2016'. Приведенный ниже сценарий делает эту работу:Loop over array

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

Поскольку мой скрипт не работает, я ищу совет.

ответ

2

Вы используете $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 
} 
+0

Спасибо @braintist! Есть только незначительная ошибка в вашем определении из $ дат, я думаю, что точка с запятой вместо запятой должна использоваться для разделения пар друг от друга: '$ dates = @ { " 23-06-2016 "=" 24-06-2016" ; "24-06-2016" = "27-06-2016" } ' –

+0

@PhilU. кричит, да, я обновил. Фактически, когда вы помещаете их в отдельные строки, как я, никакого другого разделителя не требуется. Если вы поместите пары ключ/значение в ту же строку, что и другие, то используется двоеточие. Хороший улов! – briantist