Почему PowerShell применяет предикат
blockquote>Where
к пустому списку?Поскольку
ConvertFrom-Json
говоритWhere-Object
не пытаться перечислять свои выходные данные. [1122 ]Поэтому PowerShell пытается получить доступ к свойству
name
в самом пустом массиве, как если бы мы делали:$emptyArray = New-Object object[] 0 $emptyArray.name
Когда вы заключаете
ConvertFrom-Json
в скобки, powershell интерпретирует его как отдельный конвейер , который выполняется и завершает до , любой вывод может быть отправлен наWhere-Object
, и поэтомуWhere-Object
может не знать, чтоConvertFrom-Json
хотел, чтобы он рассматривал массив как таковой .
Мы можем воссоздать это поведение в powershell, явно вызвав
Write-Output
с набором параметров переключателя-NoEnumerate
:# create a function that outputs an empty array with -NoEnumerate function Convert-Stuff { Write-Output @() -NoEnumerate } # Invoke with `Where-Object` as the downstream cmdlet in its pipeline Convert-Stuff | Where-Object { # this fails
Почему PowerShell применяет предикат
blockquote>Where
к пустому списку?Поскольку
ConvertFrom-Json
говоритWhere-Object
не пытаться перечислять свои выходные данные. [1122 ]Поэтому PowerShell пытается получить доступ к свойству
[110]name
в самом пустом массиве, как если бы мы делали:Когда вы заключаете
ConvertFrom-Json
в скобки, powershell интерпретирует его как отдельный конвейер , который выполняется и завершает до , любой вывод может быть отправлен наWhere-Object
, и поэтомуWhere-Object
может не знать, чтоConvertFrom-Json
хотел, чтобы он рассматривал массив как таковой .
Мы можем воссоздать это поведение в powershell, явно вызвав
[111]Write-Output
с набором параметров переключателя-NoEnumerate
:
Write-Output -NoEnumerate
внутренне вызываетCmdlet.WriteObject(arg, false)
, что, в свою очередь, вызывает время выполнения до , а не , перечисляет значениеarg
во время привязки параметра к нижестоящему командлету (в вашем случаеWhere-Object
)
Почему это желательно? [ 1127] blockquote>
В конкретном контексте синтаксического анализа JSON такое поведение действительно может быть желательным:
$data = '[]', '[]', '[]', '[]' |ConvertFrom-Json
Если бы я не ожидал ровно 5 объектов из
ConvertFrom-Json
теперь, когда я передал 5 допустимых JSON документы на это? : -) [тысяча сто двадцать девять].nonexistingproperty = 'fail' } # Invoke in separate pipeline, pass result to `Where-Object` subsequently $stuff = Convert-Stuff $stuff | Where-Object { # nothing happensПочему PowerShell применяет предикат
blockquote>Where
к пустому списку?Поскольку
ConvertFrom-Json
говоритWhere-Object
не пытаться перечислять свои выходные данные. [1122 ]Поэтому PowerShell пытается получить доступ к свойству
[110]name
в самом пустом массиве, как если бы мы делали:Когда вы заключаете
ConvertFrom-Json
в скобки, powershell интерпретирует его как отдельный конвейер , который выполняется и завершает до , любой вывод может быть отправлен наWhere-Object
, и поэтомуWhere-Object
может не знать, чтоConvertFrom-Json
хотел, чтобы он рассматривал массив как таковой .
Мы можем воссоздать это поведение в powershell, явно вызвав
[111]Write-Output
с набором параметров переключателя-NoEnumerate
:
Write-Output -NoEnumerate
внутренне вызываетCmdlet.WriteObject(arg, false)
, что, в свою очередь, вызывает время выполнения до , а не , перечисляет значениеarg
во время привязки параметра к нижестоящему командлету (в вашем случаеWhere-Object
)
Почему это желательно? [ 1127] blockquote>
В конкретном контексте синтаксического анализа JSON такое поведение действительно может быть желательным:
$data = '[]', '[]', '[]', '[]' |ConvertFrom-Json
Если бы я не ожидал ровно 5 объектов из
ConvertFrom-Json
теперь, когда я передал 5 допустимых JSON документы на это? : -) [тысяча сто двадцать девять].nonexistingproperty = 'meh' }
Write-Output -NoEnumerate
внутренне вызываетCmdlet.WriteObject(arg, false)
, что, в свою очередь, вызывает время выполнения до , а не , перечисляет значениеarg
во время привязки параметра к нижестоящему командлету (в вашем случаеWhere-Object
)
Почему это желательно? [ 1127] blockquote>
В конкретном контексте синтаксического анализа JSON такое поведение действительно может быть желательным:
$data = '[]', '[]', '[]', '[]' |ConvertFrom-Json
Если бы я не ожидал ровно 5 объектов из
ConvertFrom-Json
теперь, когда я передал 5 допустимых JSON документы на это? : -) [тысяча сто двадцать девять]
На основе сокета. Разъединение
Если необходимо назвать Разъединение без первого Завершения работы вызова, можно установить опцию DontLinger Socket на ложь и указать ненулевой интервал тайм-аута, чтобы гарантировать, что данные, поставленные в очередь для исходящей передачи, отправляются. Разъединение затем блокируется, пока данные не отправляются или пока указанный тайм-аут не истекает. Если Вы устанавливаете DontLinger на ложь и указываете нулевой интервал тайм-аута, Близкие выпуски соединение, и автоматически отбрасывает поставленные в очередь данные выхода.
Предполагает, что Завершение работы на высоте ненужное...
Для повторного использования сокета используйте:
socket.Shutdown(SocketShutdown.Both);
socket.Disconnect(true);
Для принудительного закрытия используйте:
socket.Shutdown(SocketShutdown.Both);
socket.Close();