2014-09-25 2 views
0

Почему выходной файл, созданный с помощью следующего сценария, не содержит всех строк, содержащихся в исходном файле? Я выполняю логику замещения на линии по линейному уровню, но я явно не удаляю никаких строк.Файл выходных данных Powershell отсутствует из входного файла

[regex]$r = "\$\%\[email protected]@(.+)\$\%\[email protected]@"; 

(Get-Content $inputFile) | 
    Foreach-Object { 
     $line = $_; 
     $find = $r.matches($line); 

     if ($find[0].Success) { 
      foreach ($match in $find) { 
       $found = $match.value   
       $replace = $found -replace "[^A-Za-z0-9\s]", "";    
       $line.Replace($found, $replace); 
      }  
     } 
    } | 
Set-Content $outputFile 

Входной файл

Input File

Выходной файл

Output File

+0

Что происходит с линией, если ($ найти [0] .Success) составляет $ ложный? – mjolinor

+0

Я ничего не делаю с линией, когда условие ложно, поэтому я предполагал, что он будет напрямую обращаться к выходному файлу. – mservidio

+1

Я думаю, что вы должны поставить под сомнение это предположение. – mjolinor

ответ

1

Вы только выводить содержимое в трубе, если он находит совпадение, в этом строка:

$line.Replace($found, $replace) 

Если не было найдено совпадение, то вам нужно вывести линию, не делая замену:

[regex]$r = "\$\%\[email protected]@(.+)\$\%\[email protected]@"; 

(Get-Content $inputFile) | 
    Foreach-Object { 
     $line = $_; 
     $find = $r.matches($line); 

     if ($find[0].Success) { 
      foreach ($match in $find) { 
       $found = $match.value   
       $replace = $found -replace "[^A-Za-z0-9\s]", "";    
       $line.Replace($found, $replace); 
      }  
     } 

     Else { $line } 

    } | 
Set-Content $outputFile