2015-04-22 2 views
2

У меня простой рабочий процесс с параллельным циклом, но при записи результата я сталкиваюсь с ошибкой. Поскольку вывод записи параллелен. Я получаю ошибку:PowerShell ForEach -параллельный файл в использовании

The process cannot access the file because it is being used by another process. 

Вот мой сценарий:

workflow Get-ServerServices 
{ 
    $srvlst = Get-Content C:\TEMP\srvlst.txt 

    foreach -parallel ($srv in $srvlst) 
    { 
     Get-Service -PSComputerName $srv | Out-File c:\temp\test.txt -Append 

    } 

} 

любая идея?

ответ

4

Я хотел бы предложить выписывая временные файлы. Вы могли бы сделать что-то вроде кода ниже:

workflow Get-ServerServices 
{ 
    #Get the temp path of the context user 
    $TempPath = Join-Path -Path $([System.IO.Path]::GetTempPath()) -ChildPath "ServerServices" 
    New-Item -Path $TempPath -ItemType Directory # and create a new sub directory 
    $srvlst = Get-Content C:\TEMP\srvlst.txt 

    foreach -parallel ($srv in $srvlst) 
    { 
     $TempFileName = [System.Guid]::NewGuid().Guid + ".txt" #GUID.txt will ensure randomness 
     $FullTempFilePath = Join-Path -Path $TempPath -ChildPath $TempFileName 
     Get-Service -PSComputerName $srv | Out-File -Path $FullTempFilePath -Force #Write out to the random file 
    } 

    $TempFiles = Get-ChildItem -Path $TempPath 
    foreach ($TempFile in $TempFiles) { 
     Get-Content -Path $TempFile.FullName | Out-File C:\temp.txt -Append #concatenate all the files 
    } 

    Remove-Item -Path $TempPath -Force -Recurse #clean up 
} 

В основном вы получаете временную директорию, добавляя новый каталог, добавив кучу GUID имени текстовых файлов с выходом, конкатенации их всех в одну, а затем удаление все они

0

Создайте имя файла test.txt на основе переменной - тогда у вас не будет конфликтов.

В конце процесса собрать все отдельные файлы и создать один файл со всеми результатами - а затем удалить отдельные файлы как часть очистки»

0

Вы можете сделать это в более простой форме с использованием буфера и вывода содержимого буфера в конце:

workflow Get-ServerServices 
{ 
    $srvlst = Get-Content C:\TEMP\srvlst.txt 
    $out = @() 

    foreach -parallel ($srv in $srvlst) 
    { 
     $WORKFLOW:out += (Get-Service -ComputerName $srv) 

    } 

    Out-File c:\temp\test.txt -InputObject $out 

} 

см technet «Переменные в параллельной и последовательности отчетности» для получения дополнительной информации

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