DataGridView. Запустить задание при параллельном вводе новой строки

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

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

Как вы можете видеть в моем скрипте, я пытаюсь использовать стартовое задание, которое у меня вообще не работает, поскольку в нем указано, что «ComputerName» имеет значение null, но ComputerName установлено в функции Get-Uptime.

Возможно, я ошибаюсь. Любая помощь была бы замечательной !!

function Check-Replication {
    #----------------------------------------------
    #region Import the Assemblies
    #----------------------------------------------
    [void][Reflection.Assembly]::Load('System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
    [void][Reflection.Assembly]::Load('System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089')
    [void][Reflection.Assembly]::Load('System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
    [void][Reflection.Assembly]::Load('System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
    [void][Reflection.Assembly]::Load('System.ServiceProcess, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a')
    #endregion Import Assemblies

    $base64Image = "iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAABGdBTUEAALGPC/xhBQAAAAJiS0dEAP+Hj8y/AAAACXBIWXMAAWG3AAFhtwFW7IyrAAAAB3RJTUUH4goDDxY48JvtEgAAAg9JREFUKM9NkT9MU1EUxn/33kf/APVPYQGaYImLYQAikU6kidFoWBwYjLgw6SZxkLhgnExc0A1ZHDC6uOmMDQ5KLCYuqINxoFgq2Ce0fbx/912GvhDOlzN9X77znXMEAFyhL7Uxmbl9vjjQn1ahrv35Vdp7NbxWc1eJaxFJIX9h+UZ9yZTMF/PVlM1Hs2Jm6yPLl/KwCIinPGZwxHsxPnGTXhQSgSEi4oB3rK7LO1vfFlA75Ib2X54rTJNFIBGAISLE0MdOrjo69GHDlteT9nxXYZQMEWBOQNPBGJmCPX81qZzL/kIuPUwPHVjxSIiI0Pj4/MXOV8pWa6Yzm0XFhIzXimLAGTqzrRkrKnbThSYgxELEwoiQkJCATrppFi09kCKJwSNJgEEgMBhCAjwCEqTQA5ZW7SME+AiiE24BPgaJQiuptI5zaCLMcRs0bSZEaSm3D/HwCdBodCzS6Dibh4valrLUoEGLQ1x8guPoPh6HODRpQkkNOs5UIp0mgUIAEZoQH5cm+/yjym6965GarXwfdC8msOJfhrFPW1Sjgl65tqRsfXrz/4SXkxg0IR4uDg322aPGFo3PPfc399QD3ti95dZYKxfg4+LQ4gCbXapUaKwn7/78MYeA59yjkK8/NNPpsxlSKDQuTRxbvs0++fT7GXOI9g+n6E+VJw9umaLJhcrSoiJKp16Pr1Xd9wAcAYNiEWcBi781AAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE4LTEwLTAzVDE1OjIyOjU2LTA0OjAwISeC9gAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxOC0xMC0wM1QxNToyMjo1Ni0wNDowMFB6OkoAAAAASUVORK5CYII = "
    $imageBytes = [Convert]::FromBase64String($base64Image)
    $memStream = New-Object IO.MemoryStream($imageBytes, 0, $imageBytes.Length)
    $memStream.Write($imageBytes, 0, $imageBytes.Length);
    $imageGrey = [System.Drawing.Bitmap]::FromStream($memStream, $true)

    $base64Image = "iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsSAAALEgHS3X78AAAAB3RJTUUH4goDDxstKOh3tAAABJVJREFUOMtVlNtvVFUUxn/r3M8w7bSddloYWkpALlqoEBJ9IIQoSUUTEYj6B8CLMSbySOKTvtQYnlDf1ITggwHFiEAIl4CVxPBAAhQKIVwCpXTaTjuXM3PmXOZsH6aA7uTbe2Vl5Vt7rXxrCf85V69epVKpkMvlejVNW2saZtq2HU3XdA+gmcRdYRRKGIalJEkm6vX6M8uy1ObNm19wyHPj2rVrJEliua671bGdnFetPbwwdm7g1v3xVTPFmXbTMLUlqXRheM3wo5HtI0U3neoJgqAahuGYpmn+8PDwS8Lx8XGSJGlzHPtz07SWnT5/ev63yye2VbTqJiujp6wlpogIoR+rZjXxcnbvnd1bd13Z/uZ2I4zDsu/7h3RdXxgaGkKuX79Oo9EwM5n2L0zD+uT4mWP1Hy791FfL1my1VBGkAiIjBAEjNnHqDvqMTrbWGe/fvr/47rb39DAKf/Y876Bpmr5hGAau6+7WNf3T38+e0L85e2h5qb+kq/6EZrYJ7SB2qzMqBKoK3dF5NjlljJ79utc0zOCtN97eZ9nWDdd1fzR83+9LuakDE/fuZL87972aWzYrskpQeZBuDdIKLEAJEivwhKRdoeyEyeYk354/bK/Mr7SX9/Z/Vi6VL2oi8m4QhJuOXfiVh9YjkRUtMpYCvQp6gRyQU5AD1QcsVUgeZFC4pSb4458/iaJoSET2akqpXZNTj+0rD/9G9SXQI0g3SBeoTlDtQBuojEAGJAN0AVmgB5KehL8eXGa2OGskSfK+EUfx6/cfP6DQfIZ0AG0K0kAaJAU4gC6AAmNRY3ErCW2tJE8LT5mcfUrKTW3U6vV6R6FYIDBDcARsWj0zQAxpkT2HAZiAqVAmYCtwFL40KJaL+HU/ozUaDYmiCEFQAiIvJ0ct3uqF9XIe5LlDtcQcxTG+74vWTJrltJPGbtrQWJRG1CpLxQrVBEkUkihoKogXEQEhSAAOLq7h0Gw2K5pK1I2u9i5yeg7KIFXAE1Qd8IEGECyiAcoHaoKqAR6oMuTtPGkrTaKSW5ph6KeWpNqjDd0b0GcENStQBJkHKYFUgEVIGaQksNCKUXOgF3U29W1GFz0xDOOUls12n7Rt8+aWFVsYjAZRTxLUlIJpoADMPoe03gIwrWAKeKxYr69nY+8QmsjdTCZzXM/n85XBFSuCZpS80yEdxuPJJ9TCKpIIhK2yVX3xp0VgRmAK5KGivzTAx2s+JJvqjjq7Or86evToGX10dJSBgYG7Cwvz3SbmlqVmn3hzVYJKiBEYaDUdKYFWFIw5E6dg4046rA3W8MGqPfSlelVHR8eRda+uGx3eOBwKwKVLl2hra+u6ffv2l4Xpwr6F6rxzv/SAp/EkDScAp6UPLdBwohT97gCr21eRttJRNps9svqV1Qc9z5vduXPnywU7NjZGJpNxb9y8+dH83NyBeq021IgC3U8CYmJEwBILx3AxdbPpOs69bHf28Lq1646Uy2Vvx44d/9/YAIVCgVwux4WLFwann03v9TxvTxAEr8VxnBEEXdcrlmVNpNvSJ3t6en4ZGRm5PzU1pfL5/AuOfwFWfAyFldyKLAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxOC0xMC0wM1QxNToyNzo0NS0wNDowMDpMU7EAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTgtMTAtMDNUMTU6Mjc6NDUtMDQ6MDBLEesNAAAAAElFTkSuQmCC"
    $imageBytes = [Convert]::FromBase64String($base64Image)
    $memStream = New-Object IO.MemoryStream($imageBytes, 0, $imageBytes.Length)
    $memStream.Write($imageBytes, 0, $imageBytes.Length);
    $imageGreen = [System.Drawing.Bitmap]::FromStream($memStream, $true)

    $base64Image = "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"
    $imageBytes = [Convert]::FromBase64String($base64Image)
    $memStream = New-Object IO.MemoryStream($imageBytes, 0, $imageBytes.Length)
    $memStream.Write($imageBytes, 0, $imageBytes.Length);
    $imageRed = [System.Drawing.Bitmap]::FromStream($memStream, $true)

    #----------------------------------------------
    #region Generated Form Objects
    #----------------------------------------------
    [System.Windows.Forms.Application]::EnableVisualStyles()
    $form1 = New-Object 'System.Windows.Forms.Form'
    $labelTypeEachComputerName = New-Object 'System.Windows.Forms.Label'
    $textbox1 = New-Object 'System.Windows.Forms.TextBox'
    $datagridview1 = New-Object 'System.Windows.Forms.DataGridView'
    $buttonRun = New-Object 'System.Windows.Forms.Button'
    $Online = New-Object 'System.Windows.Forms.DataGridViewImageColumn'
    $Uptime = New-Object 'System.Windows.Forms.DataGridViewTextBoxColumn'
    $Computer = New-Object 'System.Windows.Forms.DataGridViewTextBoxColumn'
    $Status = New-Object 'System.Windows.Forms.DataGridViewTextBoxColumn'
    $InitialFormWindowState = New-Object 'System.Windows.Forms.FormWindowState'
    #endregion Generated Form Objects

    #----------------------------------------------
    # Function Get-Uptime
    #----------------------------------------------

    #region - Get-Uptime
    $Uptime1 = {
        function Get-Uptime {
            Params ($ComputerName)
            $global:ComputerName = $row.cells[2].Value
            $os = Get-WmiObject win32_operatingsystem -ComputerName $ComputerName -ErrorAction SilentlyContinue
            if ($os.LastBootUpTime) {
                $uptime = (Get-Date) - $os.ConvertToDateTime($os.LastBootUpTime)
                #Write-Output ("Last boot: " + $os.ConvertToDateTime($os.LastBootUpTime) )
                Write-Output ("" + $uptime.Days + "d " + $uptime.Hours + "h " + $uptime.Minutes + "m" )
            } else {
                Write-Warning "Unable to connect to $computername"
            }
        }
    }
    #endregion

    #----------------------------------------------
    # User Generated Script
    #----------------------------------------------

    $FormEvent_Load = {
    }

    $textbox1_Validated = {
        if ($textbox1.Text -ne "") {
            $i = $datagridview1.Rows.Add(1)
            $row = $datagridview1.Rows[$i]
            $row.SetValues(@($imageGrey,'',$textbox1.Text,'pending'))
            $textbox1.Text = ''
            $textbox1.Focus()

        if ($row.Cells[2].Value -ne "") {
            if (Test-Connection -ComputerName $row.cells[2].Value -Count 1 -Quiet) {
                $Time = Get-Date

                Start-Job -InitializationScript $Uptime1 -scriptblock {(Get-Uptime -ComputerName $args[0])} -Args $row.cells[2].Value |
                #Start-Job -InitializationScript $Uptime1 -scriptblock {(Get-Uptime)}|
                Wait-Job | Receive-Job
                $row.SetValues(@($imageGrey,($Uptime),$row.Cells[2].Value))
                #Remove-Job -Name CheckSiteUptime
                $Time = Get-date

                $row.Cells[0].Value = $imageGreen
            } else {
                $row.Cells[0].Value = $imageRed}
            }
        }
    }

    $buttonRun_Click = {
        $datagridview1.Rows | ForEach-Object {
            $row = [System.Windows.Forms.DataGridViewRow]$_
            $CommandResult = Invoke-Command -ComputerName $row.cells[2].Value -ArgumentList $row -ScriptBlock{
                Param($row)
                Import-Module Hyper-V
                if ((Get-VM -ErrorAction Stop | Where-Object {$_.name -like '*SR*'} | Get-VMReplication -ErrorAction Stop).Replicationhealth -eq 'critical') {
                    try{
                        Get-VM -ErrorAction Stop | Where-Object {$_.name -like '*SR*'} | Resume-VMReplication -ErrorAction Stop
                        if ((Get-VM -ErrorAction Stop | Where-Object {$_.name -like '*SR*'} | Get-VMReplication -ErrorAction Stop).Replicationhealth -eq 'critical') {
                            throw [System.Exception] "Replicationhealth critical"
                        }
                    } catch {
                        try{
                            Get-VM -ErrorAction Stop | Where-Object {$_.name -like '*SR*'} | Resume-VMReplication -Resynchronize -ErrorAction Stop
                        } catch {
                            return 'FAILED: Resume-VMReplication -Resynchronize'
                            break
                        }
                        return 'Successful: Resume-VMReplication -Resynchronize'
                        break
                    }
                    return 'Successful: Resume-VMReplication'
                } else {
                    return 'Successful: No action replication is NOT critical'
                }
            }
            switch ($CommandResult) {
                "FAILED: Resume-VMReplication -Resynchronize" {
                    $row.Cells | %{$_.Style.BackColor = 'pink'}
                    $Row.Cells[3].Value = $CommandResult
                }
                "Successful: Resume-VMReplication -Resynchronize" {
                    $row.Cells | %{$_.Style.BackColor = 'lightgreen'}
                    $Row.Cells[3].Value = $CommandResult
                }
                "Successful: Resume-VMReplication" {
                    $row.Cells | %{$_.Style.BackColor = 'lightgreen'}
                    $Row.Cells[3].Value = $CommandResult
                }
                "Successful: No action replication is NOT critical" {
                    $row.Cells | %{$_.Style.BackColor = 'lightgreen'}
                    $Row.Cells[3].Value = $CommandResult
                }
            }
        }
        $datagridview1.ReadOnly = $true
    }

    # --End User Generated Script--
    #----------------------------------------------
    #region Generated Events
    #----------------------------------------------

    $Form_StateCorrection_Load = {
        #Correct the initial state of the form to prevent the .Net maximized form issue
        $form1.WindowState = $InitialFormWindowState
    }

    $Form_Cleanup_FormClosed = {
        #Remove all event handlers from the controls
        try {
            $textbox1.remove_Validated($textbox1_Validated)
            $buttonRun.remove_Click($buttonRun_Click)
            $form1.remove_Load($FormEvent_Load)
            $form1.remove_Load($Form_StateCorrection_Load)
            $form1.remove_FormClosed($Form_Cleanup_FormClosed)
        } catch {
            Out-Null <# Prevent PSScriptAnalyzer warning #>
        }
    }
    #endregion Generated Events

    #----------------------------------------------
    #region Generated Form Code
    #----------------------------------------------
    $form1.SuspendLayout()
    #
    # form1
    #
    $form1.Controls.Add($labelTypeEachComputerName)
    $form1.Controls.Add($textbox1)
    $form1.Controls.Add($datagridview1)
    $form1.Controls.Add($buttonRun)
    $form1.AutoScaleDimensions = '6, 13'
    $form1.AutoScaleMode = 'Font'
    $form1.ClientSize = '625, 600'
    $form1.FormBorderStyle = 'FixedDialog'
    $form1.MaximizeBox = $False
    $form1.MinimizeBox = $False
    $form1.Name = 'form1'
    $form1.StartPosition = 'CenterScreen'
    $form1.Text = 'Replication Check'
    $form1.add_Load($FormEvent_Load)
    #
    # labelTypeEachComputerName
    #
    $labelTypeEachComputerName.Location = '20, 18'
    $labelTypeEachComputerName.Name = 'labelTypeEachComputerName'
    $labelTypeEachComputerName.Size = '240, 49'
    #$labelTypeEachComputerName.TabIndex = 5
    $labelTypeEachComputerName.Text = 'Type each computer name ending with a <tab>  it will be added to the list.  Click run when alll have been added.'
    $labelTypeEachComputerName.UseCompatibleTextRendering = $True
    #
    # textbox1
    #
    $textbox1.CharacterCasing = 'Upper'
    $textbox1.Location = '20, 81'
    $textbox1.Name = 'textbox1'
    $textbox1.Size = '285, 20'
    #$textbox1.TabIndex = 1
    $textbox1.add_Validated($textbox1_Validated)
    #
    # datagridview1
    #
    $datagridview1.AllowUserToAddRows = $False
    $datagridview1.AllowUserToDeleteRows = $False
    $datagridview1.AllowUserToResizeColumns = $True
    $datagridview1.AllowUserToResizeRows = $False
    $datagridview1.ColumnHeadersHeightSizeMode = 'AutoSize'
    [void]$datagridview1.Columns.Add($Online)
    [void]$datagridview1.Columns.Add($Uptime)
    [void]$datagridview1.Columns.Add($Computer)
    [void]$datagridview1.Columns.Add($Status)
    $datagridview1.columns[0].Width = '40'
    $datagridview1.columns[3].Width = '250'
    $datagridview1.Location = '20, 113'
    $datagridview1.Name = 'datagridview1'
    $datagridview1.ReadOnly = $True
    $datagridview1.Size = '583, 470'
    $datagridview1.TabIndex = 3
    $datagridview1.DefaultCellStyle.WrapMode = "True"
    #
    # buttonRun
    #
    $buttonRun.Location = '325, 80'
    $buttonRun.Name = 'buttonRun'
    $buttonRun.Size = '75, 23'
    $buttonRun.TabIndex = 2
    $buttonRun.TabStop = $False
    $buttonRun.Text = 'Run'
    $buttonRun.UseCompatibleTextRendering = $True
    $buttonRun.UseVisualStyleBackColor = $True
    $buttonRun.add_Click($buttonRun_Click)
    #
    # Online
    #
    $Online.HeaderText = 'Online'
    $Online.Name = 'Online'
    $Online.DataPropertyName = 'Online'
    #
    # Uptime
    #
    $Uptime.HeaderText = 'Uptime'
    $Uptime.Name = 'Uptime'
    $Uptime.ReadOnly = $True
    #
    # Computer
    #
    $Computer.HeaderText = 'Server'
    $Computer.Name = 'Server'
    $Computer.ReadOnly = $True
    #
    # Status
    #
    $Status.HeaderText = 'Status'
    $Status.Name = 'Status'
    $Status.ReadOnly = $True

    $form1.ResumeLayout()
    #endregion Generated Form Code

    #----------------------------------------------

    #Save the initial state of the form
    $InitialFormWindowState = $form1.WindowState
    #Init the OnLoad event to correct the initial state of the form
    $form1.add_Load($Form_StateCorrection_Load)
    #Clean up the control events
    $form1.add_FormClosed($Form_Cleanup_FormClosed)
    #Show the Form
    return $form1.ShowDialog()

} #End Function

#Call the form
Check-Replication | Out-Null

Пожалуйста, сократите эту стену кода до минимальный воспроизводимый пример.

Ansgar Wiechers 16.10.2018 20:11
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
102
2

Ответы 2

Поскольку задания PowerShell выполняются в отдельном пространстве выполнения, даже объявление переменной как $ global: не делает ее доступной внутри вашего задания. Вместо этого вам нужно передать ценность своей работе, когда вы ее создаете.

Например, вы можете изменить свой код следующим образом:

...
Function Get-Uptime {
    params ($ComputerName)
    $global:ComputerName = $ComputerName
... 
Start-Job -InitializationScript $Uptime1 -scriptblock {(Get-Uptime -ComputerName $args[0])} -Args $row.cells[2].Value

Подобная проблема описана здесь: https://social.technet.microsoft.com/Forums/ie/en-US/5b369c15-d2ad-4ee8-a1fc-3f0ca8df230a/powershell-jobs-and-global-variables?forum=ITCG

Еще один ресурс о некоторых вариантах, отличных от заданий PS, которые, как правило, относительно неэффективны: https://randombrainworks.com/2018/01/28/powershell-background-jobs-runspace-jobs-thread-jobs/

Я обновил свое первоначальное сообщение вашими рекомендациями, и у меня те же проблемы. Просматривая ссылки, которые вы включили.

Shaun Bridges 16.10.2018 19:04

Другой способ обойти вашу базовую проблему отделения вашей формы / графического интерфейса от вашего внутреннего кода - использовать пространства выполнения и синхронизированную хеш-таблицу. Преимущество этой модели заключается в том, что у вас может быть много потоков, одновременно выполняющих работу и активно обновляющих форму, и вместо передачи переменных у вас есть одна копия и передаются ссылки.

Это отличная статья для начала: https://learn-powershell.net/2012/10/14/powershell-and-wpf-writing-data-to-a-ui-from-a-different-runspace/

Другие вопросы по теме