2017-02-15 3 views
0

У меня есть простой скрипт, который предполагает, чтобы найти текст, и если правильные условия соблюдены, он заменит текст:Powershell заменить дублируют результаты

foreach ($line in $file){ 
$line.replace("â‡","+") | Out-File -FilePath $destination -Append 
if ($line -eq "â‡RECORD_IDENTIFIER:"){ 
    $line.replace("â‡RECORD_IDENTIFIER:","+RECORD_IDENTIFIER: A") | Out-File -FilePath $destination -Append 
} 
if ($line -eq "â‡END_TAG"){ 
    $line.replace("â‡END_TAG","+END_TAG;") | Out-File -FilePath $destination -Append 
} 

но результат таков:

+START_TAG: 
+DATA_FILE_(DATE/TIME):2017-02-13T13:44:44.489-08:00 
+RECORD_IDENTIFIER: 
+RECORD_IDENTIFIER: A 
+CLIENT_NUM:8802 
+SOLOMON_ID:TRUG01 

Я только хочу, чтобы он создал один RECORD_IDENTIFIER.

+0

У вас есть '$ line.replace (" â ‡ "," + ")', который выполняется для строки записи. Тогда ваш if будет также запускать идентификатор записи. Поскольку '$ line' по-прежнему' 'RECORD_IDENTIFIER:' – Matt

+0

Хорошо, я пробовал примерно следующее: 'foreach ($ line in $ file) { $ line.replace (" â ‡ "," + ") | Out-File -FilePath $ destination -Append if ($ line -eq "+ RECORD_IDENTIFIER:") { $ line.replace ("+ RECORD_IDENTIFIER:", "+ RECORD_IDENTIFIER: A") | Out-File -FilePath $ destination -Append } if ($ line -eq "+ END_TAG") { $ line.replace ("+ END_TAG", "+ END_TAG;") | Out-File -FilePath $ destination -Append } } ' .... но это тоже не работает. –

ответ

3

Это место, где вам нужно найти оператора Switch. Я думаю, что это оператор, может быть, командлет? Что бы это ни было, это то, что вам нужно! То, что он делает, сравнивает текущую итерацию коллекции с несколькими случаями и применяет случаи, которые соответствуют. Например:

Switch ($file) { 

    "â‡RECORD_IDENTIFIER:" { 
     $_.Replace("â‡RECORD_IDENTIFIER:", "+RECORD_IDENTIFIER: A") | 
      Out-File -FilePath $destination -Append 
     Continue 
    } 

    "â‡END_TAG" { 
     $_.Replace("â‡END_TAG", "+END_TAG;") | 
      Out-File -FilePath $destination -Append 
     Continue 
    } 

    default { 
     $_.Replace("â‡", "+") | 
      Out-File -FilePath $destination -Append 
    } 

} 

Continue В командах говорят циклу, чтобы перейти к следующему пункту, поэтому, если он соответствует первому случаю это будет делать ваш заменить, выводят его в файл, а затем перейти к следующей строке. Если он не соответствует первому случаю, он пытается выполнить второй, и если он будет соответствовать, он заменит это, выведет на файл и перейдет к следующей строке. Если он не соответствует ни одному из первых двух случаев, он достигает строки default, и все, к чему применяется этот скриптовый блок, так что все, что не соответствовало первым двум случаям, выполнено replace("â‡","+") и выводится в файл.

+0

Этот метод работал безотказно для более простого текстового файла, я создал текстовый файл, например: blue orange yellow , используя этот код:. переключатель ($ TestFile) { «синий» {$ _ заменить ("синий", «зеленый») | Out-File -FilePath "\\ a1-gcs-snf-001 \ DataFeeds \ TrueGreen \ test_modified.txt" -Append; continue} default {$ _ | Out-File -FilePath "\\ a1-gcs-snf-001 \ DataFeeds \ TrueGreen \ test_modified.txt" -Append} } Он переключил «синий» на «зеленый» без проблем. Когда я запускаю его для своего большого текстового файла, ни один из замещений не работает. –

+0

Я получил его на работу! Что-то странное произошло с юникодом, когда я скопировал его ... Спасибо! –

Смежные вопросы