Страницы: 1
RSS
PowerShell через VBA и Excel, проверка доступности устройств по списку
 
Добрый день экспертам по EXCEL.
Хочу сделать наглядную таблицу со списком разных TCP устройств и сразу запустить проверку доступности этих устройств по разным портам,
в сети они или нет. Для этото использую PowerShell и командлет TNC (Test-NetConnection). Выглядит так -

Dim a, b
Set a = CreateObject("WScript.Shell")

b = a.Run("PowerShell TNC MyHost CommonTCPPort RDP -InformationLevel Quiet", 0, True)

Проблема в том, что результат выполнения команды TNC вполне себе TRUE, не присваивается переменной b.
Вся движуха пролетает как-то мимо этой b. То есть Run отрабатывает, проверка идет, все корректно, оболочка
открылась/закрылась, а переменная как была 0 так им и осталась.

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

Вот с пингом такая штука работает, правда там без powershell, но какая разница, ведь все равно через Run запускается.
 
Цитата
написал:
Проблема в том, что результат выполнения команды TNC вполне себе TRUE
а как Вы определили, что TRUE ? (Добрый день)

PS

Выполнение кода
Код
Sub проба()
Dim a, b
Set a = CreateObject("WScript.Shell")

b = a.Run("PowerShell TNC MyHost CommonTCPPort RDP -InformationLevel Quiet", 0, True)
End Sub
у меня на ПК вернуло b=1
Сделайте
Код
dim b as boolean
вернет TRUE/FALSE
Изменено: Михаил Лебедев - 10.08.2022 14:00:01
Всё сложное - не нужно. Всё нужное - просто /М. Т. Калашников/
 
Ну как определил что True, обычным путем, параллельно запустил сеанс PowerShell и все комманды сначала там прогоняю, чтобы перед глазами был результат.
Эту команду ввожу, получаю ответ TRUE, то есть порт RDP на данном хосте открыт. Потом меняю порт на закрытый, к примеру 21 (FTP) , снова прогняю, но значение переменной не меняется.
А вот пинг например вот такой - p = a.Run("PowerShell ping -n 1 -w 1000 MyHost", 0, True) нормально отрабатывает, активные хосты, b=0, нективные хосты b=1
Насчет определить b как Boolean я конечно же проделывал уже. Тот же результат.
Впечатление такое что почему-то TNC не возвращает значение или возвращает его в таком виде, что чего-то не хватает чтобы его получить.

Можно еще так b = a.Run("powershell (test-netconnection MyHost -port 3389).TcpTestSucceeded", 0, True)
Но тоже, увы
 
Цитата
написал:
Цитата
написал:
Проблема в том, что результат выполнения команды TNC вполне себе TRUE
а как Вы определили, что TRUE ? (Добрый день)

PS

Выполнение кода
Код
    [URL=#]?[/URL]       1  2  3  4  5  6      Sub   проба()    Dim   a, b    Set   a = CreateObject(  "WScript.Shell"  )       b = a.Run(  "PowerShell TNC MyHost CommonTCPPort RDP -InformationLevel Quiet"  , 0,   True  )    End   Sub   
  у меня на ПК вернуло b=1
Сделайте  
Код
    [URL=#]?[/URL]       1      dim b as boolean   
  вернет TRUE/FALSE
Вот! Всплыл интересный нюанс. Дело в том, что я немного некорректно дал вам строчку, упустил знак "-" перед CommonTCPPort. Это вызывает ошибку формата. И да, действительно, в этом случае b=True. То есть у нас тривозможные варианта - порт открыт, порт закрыт, ошибка формата. К сожалению, в переменную возвращается TRUE только при ошибке формата команды, на остальные два варианта он реагирует FALSE, то есть если команда верная, вне зависимости от наличия или отсутствия хоста в сети, атакже открыт у него проверяемый порт или нет, будет FALSE.

Вопрос остается, как разделить? Ведь в консоль-то PowerShell возвращается TRUE, если проверка положительна, FALSE, если проверка отрицательна и отдельно ругань, если формат команды неверен.

Есть мысли?
Страницы: 1
Наверх