Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Доступ к файлу из нескольких потоков (http://forum.oszone.net/showthread.php?t=336350)

lox-ness 23-08-2018 09:19 2828081

Доступ к файлу из нескольких потоков
 
Добрый День!
Скрипт (многопоточный - цель была именно эта) считывает данные из реестра и записывает результат в файл, при этом если с ПК нет связи ил не рабочий WMI то должен ошибки записать в разные файлы
Каким образом организовать доступ к одному файлу из разных потоков на запись?

Код:

cls
Set-PSDebug -Trace 1
workflow  reestr {
param ($IP)
foreach –parallel($PS in $IP){
InlineScript {
Try {
$pk = Test-Connection $using:ps -Count 4 -ErrorAction stop
Try {
$ArchVersion = (Get-WmiObject win32_Computersystem -computer $using:PS -ErrorAction Stop).systemtype
If ($ArchVersion -like "x64*")
{Set-Service -ComputerName $using:PS -Name RemoteRegistry -StartupType Automatic -Status Running -ErrorAction SilentlyContinue
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $using:PS, 'Registry64')
$RegKey= $Reg.OpenSubKey("SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run")
$key = $RegKey.GetValue("DelBginfoOld")
}
else {Set-Service -ComputerName $using:PS -Name RemoteRegistry -StartupType Automatic -Status Running -ErrorAction SilentlyContinue
$Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $using:PS)
$RegKey= $Reg.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run")
$key = $RegKey.GetValue("DelBginfoOld")
}
Add-Content d:\result.txt "$using:ps, $key"
}

Catch {Add-Content  d:\wmi.txt $using:ps}
}
Catch {Add-Content d:\noping.txt $using:ps}
}
}
}
$IPS = (Get-Content d:\Bginfo.txt)
Reestr $IPS


Kazun 23-08-2018 09:54 2828085

Вернуть объекты и уже в не worfklow обновлять:

Код:

workflow  reestr {
        param ($IP)
        foreach –parallel($PS in $IP){
                InlineScript {
                        Try {
                                $pk = Test-Connection $using:ps -Count 4 -ErrorAction stop
                        Try {
                                $key = ""
                                $ArchVersion = (Get-WmiObject win32_Computersystem -computer $using:PS -ErrorAction Stop).systemtype
                                If ($ArchVersion -like "x64*") {
                                        Set-Service -ComputerName $using:PS -Name RemoteRegistry -StartupType Automatic -Status Running -ErrorAction SilentlyContinue
                                        $Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $using:PS, 'Registry64')
                                        $RegKey= $Reg.OpenSubKey("SOFTWARE\Wow6432Node\Microsoft\Windows\CurrentVersion\Run")
                                        $key = $RegKey.GetValue("DelBginfoOld")
                                }
                                else {
                                        Set-Service -ComputerName $using:PS -Name RemoteRegistry -StartupType Automatic -Status Running -ErrorAction SilentlyContinue
                                        $Reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey('LocalMachine', $using:PS)
                                        $RegKey= $Reg.OpenSubKey("SOFTWARE\Microsoft\Windows\CurrentVersion\Run")
                                        $key = $RegKey.GetValue("DelBginfoOld")
                                }
                        }

                        Catch {$key = "WMI"}
                        }
                        Catch {$key = "NOPING"}
                       
                        [PSCustomObject] @{
                                ComputerName = $using:ps
                                Key = $key
                        }
                }
        }
}

$IPS = (Get-Content d:\Bginfo.txt)
Reestr $IPS | Foreach {
        if($_.Key -eq "WMI") {
                Add-Content  d:\wmi.txt $_.ComputerName
        } elseif ($_.Key -eq "NOPING") {
                Add-Content d:\noping.txt $_.ComputerName
        } else {
                Add-Content d:\result.txt "$($_.ComputerName), $($_.key)"
        }
}


Iska 23-08-2018 10:52 2828102

Цитата:

Цитата Kazun
Цитата:

Цитата lox-ness
Каким образом организовать доступ к одному файлу из разных потоков на запись? »

Вернуть объекты и уже в не worfklow обновлять: »

lox-ness, либо — не заниматься извращениями в виде текстового файла, а пользовать базу данных посредством ADO — и пишите, откуда хотите. Есть SQL — пользуйте его, нет SQL — пользуйте Jet.

lox-ness 23-08-2018 16:03 2828149

Спасибо за помощь и советы


Время: 03:54.

Время: 03:54.
© OSzone.net 2001-