Split Array на основе Test-Connection в форме - PullRequest
0 голосов
/ 27 мая 2018

Я использую PowerShell Studio для создания мультиформного скрипта, и у меня возникли некоторые проблемы.

Я пытаюсь разделить массив $ HostList ArrayList на $ OnlineHosts и $ OfflineHosts на основе Test-Connection.

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

Clear-Host  
$HostList = Get-Content "$Home\Documents\Scripts\ComputerList.txt"   
Write-Host "Pinging selected computers to verify connection..."

$OnlineHosts, $OfflineHosts = $HostList.Where({Test-Connection $_ -Count 1 -Quiet},'Split')

$OnlineHosts
pause
$OfflineHosts
pause

Clear-Host
Write-Host "Could not contact the following computers:`n`n$OfflineHosts`n`nThe following computers are online:`n`n$OnlineHosts`n`nContinue anyways?" -ForegroundColor Red 
$ReadHost= Read-Host " (y/n) "  
Switch ($ReadHost)   
{ 
     Y  {Write-Host "Yes, Continuing to main menu."} 
     N  {Write-Host "No, preparing to exit" ; Pause ; Exit}   
Default {Write-Host "Yes, Continuing to main menu." }
}

Однако в моем проекте Powershell Studio он не работает.Небольшой контекст: это новая форма, которой передается переменная $ HostList из родительской формы.Я проверил, что дочерняя форма получает переменную, выполнив Write-Host "$ HostList woohoo!"Я протестировал размещение кода Test-Connection как внутри, так и снаружи команды $ formTest_Load.Честно говоря, я не уверен, что именно помещать или не помещать в команду $ formTest_Load, поэтому информация об этом также будет полезна.

Вот код из моего проекта PowerShell Studio:

param ( [parameter(Mandatory = $true)] 
       [string]$global:HostList ) 

$global:OnlineHosts = [System.Collections.ArrayList]@()
Write-Host "$HostList woohoo!"    

$formTest_Load =   
{ 
     $OnlineHosts.Add($HostList) 
     $OnlineHosts, $OfflineHosts = $HostList.Where({Test-Connection $_ -Count 1 -Quiet  },'Split')
}

Вот код ошибки, который я получаю при запуске своей программы PowerShell Studio:

ОШИБКА:Test-Connection: общий сбой formPing.psf (14, 49): ОШИБКА: в строке: 14 символов: 49 ОШИБКА: + ... neHosts = $ HostList.Where ({Test-Connection $ _ -Count 1 Quiet}, 'Spl ... ОШИБКА: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ОШИБКА: + CategoryInfo: InvalidOperation: (:) [Test-Connection], ManagementException ОШИБКА: + FullyQualifiedErrorId: TestConnectionException, Microsoft.PowerShell.Commands.Test ConnectionCommand ОШИБКА:

Мой код Test-Connection выглядит символьно-символическим, как и в моемстарый файл ps1.

Кто-нибудь может увидеть, что может быть причиной ошибки?

Спасибо.

Кроме того, вот информация о том, что я использую: -Windows 10 Pro -PowerShell Studio 2018-версия 5.5.152.0 -64 бит

Запустите следующий код в ISE, и вы увидите, что я пытаюсь сделатьо:

$HostList = [System.Collections.ArrayList]@()
$HostList += HostName 
$HostList += "FakeComputer"
Clear-Host

Write-Host "HostList contains: $HostList"
pause
Clear-Host

Write-Host "Verifying connection to target hosts..."
$OnlineHosts, $OfflineHosts = $HostList.Where({Test-Connection $_ -Count 1 -Quiet }, 'Split')
Clear-Host

Write-Host "HostList contains: $HostList`n"
Write-Host "OnlineHosts contains: $OnlineHosts`n"
Write-Host "OfflineHosts contains: $OfflineHosts`n"
pause

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Я бы не использовал метод Where с таким делегатом.Это работает, но на самом деле это не то, как обычно пишется PowerShell.Поддержка LINQ в PowerShell в лучшем случае неудобна, так что шаблон стиля не совсем соответствует обычному стилю.Я бы ожидал что-то вроде этого:

$OnlineHosts = foreach ($HostName in $HostList) {
    if (Test-Connection -ComputerName $HostName -Count 1 -Quiet) {
        $HostName
    }
}

$OfflineHosts = $HostList | Where-Object { $_ -notin $OnlineHosts }

Или вот так:

[System.Collections.ArrayList]$OnlineHosts = @()
[System.Collections.ArrayList]$OfflineHosts = @()

foreach ($HostName in $HostList) {
    if (Test-Connection -ComputerName $HostName -Count 1 -Quiet) {
        $OnlineHosts.Add($HostName)
    }
    else {
        $OfflineHosts.Add($HostName)
    }
}
0 голосов
/ 27 мая 2018

Я решил проблему, произошла ошибка с тем, как мой скрипт передавал переменные.Метод ручного ввода имен компьютеров в родительской форме некорректно передавал переменную из поля ее скрипта.

Спасибо за вашу помощь!

...