Объект PowerShell Socket отличается, если создается через функцию, и через CLI - PullRequest
0 голосов
/ 13 сентября 2010

У меня есть функция:

function QuerySMTPServer ([string]$strSMTPServerName) {
    # open up a socket to the SMTP server
    $socket = New-Object System.Net.Sockets.TCPClient
    $socket.connect($strSMTPServerName, 25)
    $socket # output for testing

    # read response data (should be a line starting with 220; cf. RFC821)
    $stream = $socket.getStream()
    $stream # output for testing
    ...

Если я запустил функцию и передал ей наш (хорошо настроенный и работающий) адрес SMTP-сервера, то объекты $ socket и $ stream, которые выводятся, сообщают мне, что в сокете доступно 0 байтов, а в поток:

PS C:\Users\dan.maftei\Documents> QuerySMTPServer "internal-smtp.XYZ.com"

($socket)
Client              : System.Net.Sockets.Socket
Available           : 0
Connected           : True
...
($stream)
DataAvailable : False

Тем не менее, данные действительно есть, поскольку я могу создать байтовый массив и прочитать его с помощью метода read () из объекта $ stream. На самом деле это именно то, что я делаю в оставшейся части функции, и все это работает без ошибок. (!)

Еще страннее, если я вручную введу в исполняемый файл PowerShell те же самые командлеты, что и мои вызовы функций, мой $ socket внезапно (и правильно) утверждает, что у него есть 79 байтов данных, и мой $ stream также говорит, что он имеет доступные данные:

PS C:\Users\dan.maftei\Documents> $socket = New-Object System.Net.Sockets.TCPClient

PS C:\Users\dan.maftei\Documents> $socket.connect("internal-smtp.XYZ.com", 25)

PS C:\Users\dan.maftei\Documents> $socket

Client              : System.Net.Sockets.Socket
Available           : 79
Connected           : True

PS C:\Users\dan.maftei\Documents> $stream = $socket.getStream()

PS C:\Users\dan.maftei\Documents> $stream

...
DataAvailable : True
...

Что происходит ?? Почему я получаю разные объекты, если я запускаю эти несколько командлетов через CLI, а не через функцию? Почему я все еще могу читать данные из моего потока $, хотя, очевидно, их нет в соответствии с выводом в функции?

1 Ответ

1 голос
/ 16 сентября 2010

cf: http://social.technet.microsoft.com/Forums/en/winserverpowershell/thread/d6420c96-3cdc-4af8-86d3-224b61a3b52f

2-е сообщение от jrich: PS поспешен в сценариях, он не ждет удаленных данных;Заставить скрипт на секунду (что, вероятно, излишне) исправить все.

...