У меня есть функция:
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, а не через функцию? Почему я все еще могу читать данные из моего потока $, хотя, очевидно, их нет в соответствии с выводом в функции?