Как заменить несколько строк в текстовом файле и сгенерировать файл журнала одновременно?

#powershell

#powershell

Вопрос:

В папке находится несколько текстовых файлов, и в каждом текстовом файле есть несколько затронутых идентификаторов. Мне нужно заменить их новыми идентификаторами. Кроме того, я хочу сгенерировать текстовый файл журнала со списком имени файла, oldID,newID . Этот файл журнала необходим для перекрестной проверки и проверки. У меня есть файл csv, из которого я создаю список идентификаторов массива. Я перечислил часть кода для замены строки ниже.

 foreach ($f in gci -r -include "*.txt")
{
Set-Variable -Name filename -value ($f.name)


for( $i=0; $i -le $elementCount; $i  )
 {
Write-Host $i
$oldString= $IdList[$i].OLD_ID ',' $IdList[$i].OLD_ID_TYPE
$newString= $IdList[$i].NEW_ID ',' $IdList[$i].NEW_ID_TYPE

 gc $f.fullname|ForEach-Object {if($_.contains($oldString)){ "$filename,$oldString,$newString" >> $logFile; $_ -replace $oldString,$newString}}| sc $f.fullname

 } 

}
 

Я получаю сообщение об ошибке :

 Set-Content : The process cannot access the file 'U:testScriptrapg6785.txt' because it is being used by another process.
At line:22 char:152
       gc $f.fullname|ForEach-Object {if($_.contains($oldString)){ "$filename,$oldString,$newString" >> $logFile; $_ -replace $oldString,$newString}}| sc <<<<  $f.fullname
  CategoryInfo          : NotSpecified: (:) [Set-Content], IOException
  FullyQualifiedErrorId : System.IO.IOException,Microsoft.PowerShell.Commands.SetContentCommand
 

Комментарии:

1. попробуйте заключить gc $f.fullname в скобки: (gc $f.fullname)

2. спасибо CB. он работает с (gc $ f.fullname). Можете ли вы также сказать, в чем разница со скобками и без скобок?

3. Добавлено в качестве ответа 😉

Ответ №1:

попробуйте заключить gc $f.fullname в скобки : (gc $f.fullname) .

Таким образом, конвейер запускается, когда gc заканчивается, чтобы прочитать файл и освободить дескриптор файла для использования другим процессом.