Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Почему 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 документы на это? : -) [тысяча сто двадцать девять]
С пустым массивом в качестве прямого входного конвейера, ничего не передается по конвейеру , потому что массив нумеруется , перечисляется , и поскольку перечислять нечего - пустой массив не имеет элементов - блок скрипта Where
никогда не выполняется:
# The empty array is enumerated, and since there's nothing to enumerate,
# the Where[-Object] script block is never invoked.
@() | Where { С пустым массивом в качестве прямого входного конвейера, ничего не передается по конвейеру , потому что массив нумеруется , перечисляется , и поскольку перечислять нечего - пустой массив не имеет элементов - блок скрипта Where
никогда не выполняется:
[110] В отличие от этого, "[]" | ConvertFrom-Json
создает пустой массив как один выходной объект вместо того, чтобы перечислять его (несуществующие) элементы, потому что ConvertFrom-Json
по проекту не перечисляет элементы массивов, которые он выводит ; это эквивалентно: поведение
# Empty array is sent as a single object through the pipeline.
# The Where script block is invoked once and sees С пустым массивом в качестве прямого входного конвейера, ничего не передается по конвейеру , потому что массив нумеруется , перечисляется , и поскольку перечислять нечего - пустой массив не имеет элементов - блок скрипта Where
никогда не выполняется:
[110] В отличие от этого, "[]" | ConvertFrom-Json
создает пустой массив как один выходной объект вместо того, чтобы перечислять его (несуществующие) элементы, потому что ConvertFrom-Json
по проекту не перечисляет элементы массивов, которые он выводит ; это эквивалентно: поведение
[111] ConvertFrom-Json
удивительно в контексте PowerShell - командлеты обычно перечисляют несколько выходов - но [1175 ] имеет смысл в контексте анализа JSON ; в конце концов, информация была бы потеряна , если бы ConvertFrom-Json
перечислил пустой массив, учитывая, что тогда вы не сможете отличить это от пустого ввода JSON ("" | ConvertFrom-Json
).
Это напряжение обсуждается в этой проблеме GitHub .
Консенсус заключается в том, что оба варианта использования являются законными и что у пользователей должен быть выбор между двумя вариантами поведения - перечислением или нет - с помощью переключателя ]; Начиная с PowerShell Core 6.2.0, формальное решение не было принято, но если должна быть сохранена обратная совместимость, это должно быть поведение перечисления, которое является opt-in (например, -Enumerate
) . [+1162]
Если перечисление желательно, пока - обходной путь - это принудительное перечисление , просто заключив вызов ConvertFrom-Json
в (...)
(который преобразует его в [ 1150] выражение , а выражения всегда перечисляют выходные данные команды при использовании в конвейере):
# (...) around the ConvertFrom-Json call forces enumeration of its output.
# The empty array has nothing to enumerate, so the Where script block is never invoked.
("[]" | ConvertFrom-Json) | Where { С пустым массивом в качестве прямого входного конвейера, ничего не передается по конвейеру , потому что массив нумеруется , перечисляется , и поскольку перечислять нечего - пустой массив не имеет элементов - блок скрипта Where
никогда не выполняется:
[110] В отличие от этого, "[]" | ConvertFrom-Json
создает пустой массив как один выходной объект вместо того, чтобы перечислять его (несуществующие) элементы, потому что ConvertFrom-Json
по проекту не перечисляет элементы массивов, которые он выводит ; это эквивалентно: поведение
[111] ConvertFrom-Json
удивительно в контексте PowerShell - командлеты обычно перечисляют несколько выходов - но [1175 ] имеет смысл в контексте анализа JSON ; в конце концов, информация была бы потеряна , если бы ConvertFrom-Json
перечислил пустой массив, учитывая, что тогда вы не сможете отличить это от пустого ввода JSON ("" | ConvertFrom-Json
).
Это напряжение обсуждается в этой проблеме GitHub .
Консенсус заключается в том, что оба варианта использования являются законными и что у пользователей должен быть выбор между двумя вариантами поведения - перечислением или нет - с помощью переключателя ]; Начиная с PowerShell Core 6.2.0, формальное решение не было принято, но если должна быть сохранена обратная совместимость, это должно быть поведение перечисления, которое является opt-in (например, -Enumerate
) . [+1162]
Если перечисление желательно, пока - обходной путь - это принудительное перечисление , просто заключив вызов ConvertFrom-Json
в (...)
(который преобразует его в [ 1150] выражение , а выражения всегда перечисляют выходные данные команды при использовании в конвейере):
[112]
Что касается того, что вы пытались : ваша попытка получить доступ к Свойство .Count
и ваше использование @(...)
:
$y = ("[]" | ConvertFrom-Json) | Where { С пустым массивом в качестве прямого входного конвейера, ничего не передается по конвейеру , потому что массив нумеруется , перечисляется , и поскольку перечислять нечего - пустой массив не имеет элементов - блок скрипта Where
никогда не выполняется:
[110] В отличие от этого, "[]" | ConvertFrom-Json
создает пустой массив как один выходной объект вместо того, чтобы перечислять его (несуществующие) элементы, потому что ConvertFrom-Json
по проекту не перечисляет элементы массивов, которые он выводит ; это эквивалентно: поведение
[111] ConvertFrom-Json
удивительно в контексте PowerShell - командлеты обычно перечисляют несколько выходов - но [1175 ] имеет смысл в контексте анализа JSON ; в конце концов, информация была бы потеряна , если бы ConvertFrom-Json
перечислил пустой массив, учитывая, что тогда вы не сможете отличить это от пустого ввода JSON ("" | ConvertFrom-Json
).
Это напряжение обсуждается в этой проблеме GitHub .
Консенсус заключается в том, что оба варианта использования являются законными и что у пользователей должен быть выбор между двумя вариантами поведения - перечислением или нет - с помощью переключателя ]; Начиная с PowerShell Core 6.2.0, формальное решение не было принято, но если должна быть сохранена обратная совместимость, это должно быть поведение перечисления, которое является opt-in (например, -Enumerate
) . [+1162]
Если перечисление желательно, пока - обходной путь - это принудительное перечисление , просто заключив вызов ConvertFrom-Json
в (...)
(который преобразует его в [ 1150] выражение , а выражения всегда перечисляют выходные данные команды при использовании в конвейере):
[112]
Что касается того, что вы пытались : ваша попытка получить доступ к Свойство .Count
и ваше использование @(...)
:
[113] С вызовом ConvertFrom-Json
, заключенным в (...)
, ваша общая команда возвращает «ничто»: свободно говоря, $null
, но, точнее, «массив-значение ноль», который является синглтоном [System.Management.Automation.Internal.AutomationNull]::Value
, который указывает на отсутствие вывода команды. (В большинстве случаев последний обрабатывается так же, как $null
, хотя, в частности, не используется в качестве входных данных конвейера.)
[System.Management.Automation.Internal.AutomationNull]::Value
не имеет свойства .Count
, поэтому с [ 1123] или выше, вы получите ошибку The property 'count' cannot be found on this object.
.
Оборачивая весь конвейер в @(...)
, оператор подвыражения массива, вы гарантируете обработку выходных данных как массива , который с помощью [null output со значением массива создает пустой массив - что имеет свойство .Count
.
Обратите внимание, что вы должны иметь возможность вызывать .Count
для $null
и [System.Management.Automation.Internal.AutomationNull]::Value
, учитывая, что PowerShell добавляет свойство .Count
в каждый [ 1154] объект, если он еще не существует, включая скаляры, в похвальном стремлении унифицировать обработку коллекций и скаляров.
То есть с Set-StrictMode
, установленным на -Off
(по умолчанию) или на -Version 1
, следующее работает и - разумно - возвращает 0
:
# With Set-StrictMode set to -Off (the default) or -Version 1:
# $null sensibly has a count of 0.
PS> $null.Count
0
# So does the "array-valued null", [System.Management.Automation.Internal.AutomationNull]::Value
# `. {}` is a simple way to produce it.
PS> (. {}).Count # `. {}` outputs
0
[ 1170] То, что вышеупомянутое в настоящее время не не работает с Set-StrictMode -Version 2
или выше (по состоянию на PowerShell Core 6.2.0), следует считать ошибкой , как сообщалось в , в этом выпуске GitHub (не менее Джеффри Сновером). .name -eq "Baz" }
$y.Count # Fails with Set-StrictMode -Version 2 or higher
С вызовом ConvertFrom-Json
, заключенным в (...)
, ваша общая команда возвращает «ничто»: свободно говоря, $null
, но, точнее, «массив-значение ноль», который является синглтоном [System.Management.Automation.Internal.AutomationNull]::Value
, который указывает на отсутствие вывода команды. (В большинстве случаев последний обрабатывается так же, как $null
, хотя, в частности, не используется в качестве входных данных конвейера.)
[System.Management.Automation.Internal.AutomationNull]::Value
не имеет свойства .Count
, поэтому с [ 1123] или выше, вы получите ошибку The property 'count' cannot be found on this object.
.
Оборачивая весь конвейер в @(...)
, оператор подвыражения массива, вы гарантируете обработку выходных данных как массива , который с помощью [null output со значением массива создает пустой массив - что имеет свойство .Count
.
Обратите внимание, что вы должны иметь возможность вызывать .Count
для $null
и [System.Management.Automation.Internal.AutomationNull]::Value
, учитывая, что PowerShell добавляет свойство .Count
в каждый [ 1154] объект, если он еще не существует, включая скаляры, в похвальном стремлении унифицировать обработку коллекций и скаляров.
То есть с Set-StrictMode
, установленным на -Off
(по умолчанию) или на -Version 1
, следующее работает и - разумно - возвращает 0
:
# With Set-StrictMode set to -Off (the default) or -Version 1:
# $null sensibly has a count of 0.
PS> $null.Count
0
# So does the "array-valued null", [System.Management.Automation.Internal.AutomationNull]::Value
# `. {}` is a simple way to produce it.
PS> (. {}).Count # `. {}` outputs
0
[ 1170] То, что вышеупомянутое в настоящее время не не работает с Set-StrictMode -Version 2
или выше (по состоянию на PowerShell Core 6.2.0), следует считать ошибкой , как сообщалось в , в этом выпуске GitHub (не менее Джеффри Сновером). .name -eq "Baz" }
Что касается того, что вы пытались : ваша попытка получить доступ к Свойство .Count
и ваше использование @(...)
:
$y = ("[]" | ConvertFrom-Json) | Where { С пустым массивом в качестве прямого входного конвейера, ничего не передается по конвейеру , потому что массив нумеруется , перечисляется , и поскольку перечислять нечего - пустой массив не имеет элементов - блок скрипта Where
никогда не выполняется:
[110] В отличие от этого, "[]" | ConvertFrom-Json
создает пустой массив как один выходной объект вместо того, чтобы перечислять его (несуществующие) элементы, потому что ConvertFrom-Json
по проекту не перечисляет элементы массивов, которые он выводит ; это эквивалентно: поведение
[111] ConvertFrom-Json
удивительно в контексте PowerShell - командлеты обычно перечисляют несколько выходов - но [1175 ] имеет смысл в контексте анализа JSON ; в конце концов, информация была бы потеряна , если бы ConvertFrom-Json
перечислил пустой массив, учитывая, что тогда вы не сможете отличить это от пустого ввода JSON ("" | ConvertFrom-Json
).
Это напряжение обсуждается в этой проблеме GitHub .
Консенсус заключается в том, что оба варианта использования являются законными и что у пользователей должен быть выбор между двумя вариантами поведения - перечислением или нет - с помощью переключателя ]; Начиная с PowerShell Core 6.2.0, формальное решение не было принято, но если должна быть сохранена обратная совместимость, это должно быть поведение перечисления, которое является opt-in (например, -Enumerate
) . [+1162]
Если перечисление желательно, пока - обходной путь - это принудительное перечисление , просто заключив вызов ConvertFrom-Json
в (...)
(который преобразует его в [ 1150] выражение , а выражения всегда перечисляют выходные данные команды при использовании в конвейере):
[112]
Что касается того, что вы пытались : ваша попытка получить доступ к Свойство .Count
и ваше использование @(...)
:
[113] С вызовом ConvertFrom-Json
, заключенным в (...)
, ваша общая команда возвращает «ничто»: свободно говоря, $null
, но, точнее, «массив-значение ноль», который является синглтоном [System.Management.Automation.Internal.AutomationNull]::Value
, который указывает на отсутствие вывода команды. (В большинстве случаев последний обрабатывается так же, как $null
, хотя, в частности, не используется в качестве входных данных конвейера.)
[System.Management.Automation.Internal.AutomationNull]::Value
не имеет свойства .Count
, поэтому с [ 1123] или выше, вы получите ошибку The property 'count' cannot be found on this object.
.
Оборачивая весь конвейер в @(...)
, оператор подвыражения массива, вы гарантируете обработку выходных данных как массива , который с помощью [null output со значением массива создает пустой массив - что имеет свойство .Count
.
Обратите внимание, что вы должны иметь возможность вызывать .Count
для $null
и [System.Management.Automation.Internal.AutomationNull]::Value
, учитывая, что PowerShell добавляет свойство .Count
в каждый [ 1154] объект, если он еще не существует, включая скаляры, в похвальном стремлении унифицировать обработку коллекций и скаляров.
То есть с Set-StrictMode
, установленным на -Off
(по умолчанию) или на -Version 1
, следующее работает и - разумно - возвращает 0
:
# With Set-StrictMode set to -Off (the default) or -Version 1:
# $null sensibly has a count of 0.
PS> $null.Count
0
# So does the "array-valued null", [System.Management.Automation.Internal.AutomationNull]::Value
# `. {}` is a simple way to produce it.
PS> (. {}).Count # `. {}` outputs
0
[ 1170] То, что вышеупомянутое в настоящее время не не работает с Set-StrictMode -Version 2
или выше (по состоянию на PowerShell Core 6.2.0), следует считать ошибкой , как сообщалось в , в этом выпуске GitHub (не менее Джеффри Сновером). .name -eq "Baz" }
$y.Count # Fails with Set-StrictMode -Version 2 or higher
С вызовом ConvertFrom-Json
, заключенным в (...)
, ваша общая команда возвращает «ничто»: свободно говоря, $null
, но, точнее, «массив-значение ноль», который является синглтоном [System.Management.Automation.Internal.AutomationNull]::Value
, который указывает на отсутствие вывода команды. (В большинстве случаев последний обрабатывается так же, как $null
, хотя, в частности, не используется в качестве входных данных конвейера.)
[System.Management.Automation.Internal.AutomationNull]::Value
не имеет свойства .Count
, поэтому с [ 1123] или выше, вы получите ошибку The property 'count' cannot be found on this object.
.
Оборачивая весь конвейер в @(...)
, оператор подвыражения массива, вы гарантируете обработку выходных данных как массива , который с помощью [null output со значением массива создает пустой массив - что имеет свойство .Count
.
Обратите внимание, что вы должны иметь возможность вызывать .Count
для $null
и [System.Management.Automation.Internal.AutomationNull]::Value
, учитывая, что PowerShell добавляет свойство .Count
в каждый [ 1154] объект, если он еще не существует, включая скаляры, в похвальном стремлении унифицировать обработку коллекций и скаляров.
То есть с Set-StrictMode
, установленным на -Off
(по умолчанию) или на -Version 1
, следующее работает и - разумно - возвращает 0
:
# With Set-StrictMode set to -Off (the default) or -Version 1:
# $null sensibly has a count of 0.
PS> $null.Count
0
# So does the "array-valued null", [System.Management.Automation.Internal.AutomationNull]::Value
# `. {}` is a simple way to produce it.
PS> (. {}).Count # `. {}` outputs
0
[ 1170] То, что вышеупомянутое в настоящее время не не работает с Set-StrictMode -Version 2
или выше (по состоянию на PowerShell Core 6.2.0), следует считать ошибкой , как сообщалось в , в этом выпуске GitHub (не менее Джеффри Сновером). as that empty array.
Write-Output -NoEnumerate @() | Where {
С пустым массивом в качестве прямого входного конвейера, ничего не передается по конвейеру , потому что массив нумеруется , перечисляется , и поскольку перечислять нечего - пустой массив не имеет элементов - блок скрипта Where
никогда не выполняется:
[110] В отличие от этого, "[]" | ConvertFrom-Json
создает пустой массив как один выходной объект вместо того, чтобы перечислять его (несуществующие) элементы, потому что ConvertFrom-Json
по проекту не перечисляет элементы массивов, которые он выводит ; это эквивалентно: поведение
[111] ConvertFrom-Json
удивительно в контексте PowerShell - командлеты обычно перечисляют несколько выходов - но [1175 ] имеет смысл в контексте анализа JSON ; в конце концов, информация была бы потеряна , если бы ConvertFrom-Json
перечислил пустой массив, учитывая, что тогда вы не сможете отличить это от пустого ввода JSON ("" | ConvertFrom-Json
).
Это напряжение обсуждается в этой проблеме GitHub .
Консенсус заключается в том, что оба варианта использования являются законными и что у пользователей должен быть выбор между двумя вариантами поведения - перечислением или нет - с помощью переключателя ]; Начиная с PowerShell Core 6.2.0, формальное решение не было принято, но если должна быть сохранена обратная совместимость, это должно быть поведение перечисления, которое является opt-in (например, -Enumerate
) . [+1162]
Если перечисление желательно, пока - обходной путь - это принудительное перечисление , просто заключив вызов ConvertFrom-Json
в (...)
(который преобразует его в [ 1150] выражение , а выражения всегда перечисляют выходные данные команды при использовании в конвейере):
# (...) around the ConvertFrom-Json call forces enumeration of its output.
# The empty array has nothing to enumerate, so the Where script block is never invoked.
("[]" | ConvertFrom-Json) | Where { С пустым массивом в качестве прямого входного конвейера, ничего не передается по конвейеру , потому что массив нумеруется , перечисляется , и поскольку перечислять нечего - пустой массив не имеет элементов - блок скрипта Where
никогда не выполняется:
[110] В отличие от этого, "[]" | ConvertFrom-Json
создает пустой массив как один выходной объект вместо того, чтобы перечислять его (несуществующие) элементы, потому что ConvertFrom-Json
по проекту не перечисляет элементы массивов, которые он выводит ; это эквивалентно: поведение
[111] ConvertFrom-Json
удивительно в контексте PowerShell - командлеты обычно перечисляют несколько выходов - но [1175 ] имеет смысл в контексте анализа JSON ; в конце концов, информация была бы потеряна , если бы ConvertFrom-Json
перечислил пустой массив, учитывая, что тогда вы не сможете отличить это от пустого ввода JSON ("" | ConvertFrom-Json
).
Это напряжение обсуждается в этой проблеме GitHub .
Консенсус заключается в том, что оба варианта использования являются законными и что у пользователей должен быть выбор между двумя вариантами поведения - перечислением или нет - с помощью переключателя ]; Начиная с PowerShell Core 6.2.0, формальное решение не было принято, но если должна быть сохранена обратная совместимость, это должно быть поведение перечисления, которое является opt-in (например, -Enumerate
) . [+1162]
Если перечисление желательно, пока - обходной путь - это принудительное перечисление , просто заключив вызов ConvertFrom-Json
в (...)
(который преобразует его в [ 1150] выражение , а выражения всегда перечисляют выходные данные команды при использовании в конвейере):
[112]
Что касается того, что вы пытались : ваша попытка получить доступ к Свойство .Count
и ваше использование @(...)
:
$y = ("[]" | ConvertFrom-Json) | Where { С пустым массивом в качестве прямого входного конвейера, ничего не передается по конвейеру , потому что массив нумеруется , перечисляется , и поскольку перечислять нечего - пустой массив не имеет элементов - блок скрипта Where
никогда не выполняется:
[110] В отличие от этого, "[]" | ConvertFrom-Json
создает пустой массив как один выходной объект вместо того, чтобы перечислять его (несуществующие) элементы, потому что ConvertFrom-Json
по проекту не перечисляет элементы массивов, которые он выводит ; это эквивалентно: поведение
[111] ConvertFrom-Json
удивительно в контексте PowerShell - командлеты обычно перечисляют несколько выходов - но [1175 ] имеет смысл в контексте анализа JSON ; в конце концов, информация была бы потеряна , если бы ConvertFrom-Json
перечислил пустой массив, учитывая, что тогда вы не сможете отличить это от пустого ввода JSON ("" | ConvertFrom-Json
).
Это напряжение обсуждается в этой проблеме GitHub .
Консенсус заключается в том, что оба варианта использования являются законными и что у пользователей должен быть выбор между двумя вариантами поведения - перечислением или нет - с помощью переключателя ]; Начиная с PowerShell Core 6.2.0, формальное решение не было принято, но если должна быть сохранена обратная совместимость, это должно быть поведение перечисления, которое является opt-in (например, -Enumerate
) . [+1162]
Если перечисление желательно, пока - обходной путь - это принудительное перечисление , просто заключив вызов ConvertFrom-Json
в (...)
(который преобразует его в [ 1150] выражение , а выражения всегда перечисляют выходные данные команды при использовании в конвейере):
[112]
Что касается того, что вы пытались : ваша попытка получить доступ к Свойство .Count
и ваше использование @(...)
:
[113] С вызовом ConvertFrom-Json
, заключенным в (...)
, ваша общая команда возвращает «ничто»: свободно говоря, $null
, но, точнее, «массив-значение ноль», который является синглтоном [System.Management.Automation.Internal.AutomationNull]::Value
, который указывает на отсутствие вывода команды. (В большинстве случаев последний обрабатывается так же, как $null
, хотя, в частности, не используется в качестве входных данных конвейера.)
[System.Management.Automation.Internal.AutomationNull]::Value
не имеет свойства .Count
, поэтому с [ 1123] или выше, вы получите ошибку The property 'count' cannot be found on this object.
.
Оборачивая весь конвейер в @(...)
, оператор подвыражения массива, вы гарантируете обработку выходных данных как массива , который с помощью [null output со значением массива создает пустой массив - что имеет свойство .Count
.
Обратите внимание, что вы должны иметь возможность вызывать .Count
для $null
и [System.Management.Automation.Internal.AutomationNull]::Value
, учитывая, что PowerShell добавляет свойство .Count
в каждый [ 1154] объект, если он еще не существует, включая скаляры, в похвальном стремлении унифицировать обработку коллекций и скаляров.
То есть с Set-StrictMode
, установленным на -Off
(по умолчанию) или на -Version 1
, следующее работает и - разумно - возвращает 0
:
# With Set-StrictMode set to -Off (the default) or -Version 1:
# $null sensibly has a count of 0.
PS> $null.Count
0
# So does the "array-valued null", [System.Management.Automation.Internal.AutomationNull]::Value
# `. {}` is a simple way to produce it.
PS> (. {}).Count # `. {}` outputs
0
[ 1170] То, что вышеупомянутое в настоящее время не не работает с Set-StrictMode -Version 2
или выше (по состоянию на PowerShell Core 6.2.0), следует считать ошибкой , как сообщалось в , в этом выпуске GitHub (не менее Джеффри Сновером). .name -eq "Baz" }
$y.Count # Fails with Set-StrictMode -Version 2 or higher
С вызовом ConvertFrom-Json
, заключенным в (...)
, ваша общая команда возвращает «ничто»: свободно говоря, $null
, но, точнее, «массив-значение ноль», который является синглтоном [System.Management.Automation.Internal.AutomationNull]::Value
, который указывает на отсутствие вывода команды. (В большинстве случаев последний обрабатывается так же, как $null
, хотя, в частности, не используется в качестве входных данных конвейера.)
[System.Management.Automation.Internal.AutomationNull]::Value
не имеет свойства .Count
, поэтому с [ 1123] или выше, вы получите ошибку The property 'count' cannot be found on this object.
.
Оборачивая весь конвейер в @(...)
, оператор подвыражения массива, вы гарантируете обработку выходных данных как массива , который с помощью [null output со значением массива создает пустой массив - что имеет свойство .Count
.
Обратите внимание, что вы должны иметь возможность вызывать .Count
для $null
и [System.Management.Automation.Internal.AutomationNull]::Value
, учитывая, что PowerShell добавляет свойство .Count
в каждый [ 1154] объект, если он еще не существует, включая скаляры, в похвальном стремлении унифицировать обработку коллекций и скаляров.
То есть с Set-StrictMode
, установленным на -Off
(по умолчанию) или на -Version 1
, следующее работает и - разумно - возвращает 0
:
# With Set-StrictMode set to -Off (the default) or -Version 1:
# $null sensibly has a count of 0.
PS> $null.Count
0
# So does the "array-valued null", [System.Management.Automation.Internal.AutomationNull]::Value
# `. {}` is a simple way to produce it.
PS> (. {}).Count # `. {}` outputs
0
[ 1170] То, что вышеупомянутое в настоящее время не не работает с Set-StrictMode -Version 2
или выше (по состоянию на PowerShell Core 6.2.0), следует считать ошибкой , как сообщалось в , в этом выпуске GitHub (не менее Джеффри Сновером). .name -eq "Baz" }
Что касается того, что вы пытались : ваша попытка получить доступ к Свойство .Count
и ваше использование @(...)
:
$y = ("[]" | ConvertFrom-Json) | Where { С пустым массивом в качестве прямого входного конвейера, ничего не передается по конвейеру , потому что массив нумеруется , перечисляется , и поскольку перечислять нечего - пустой массив не имеет элементов - блок скрипта Where
никогда не выполняется:
[110] В отличие от этого, "[]" | ConvertFrom-Json
создает пустой массив как один выходной объект вместо того, чтобы перечислять его (несуществующие) элементы, потому что ConvertFrom-Json
по проекту не перечисляет элементы массивов, которые он выводит ; это эквивалентно: поведение
[111] ConvertFrom-Json
удивительно в контексте PowerShell - командлеты обычно перечисляют несколько выходов - но [1175 ] имеет смысл в контексте анализа JSON ; в конце концов, информация была бы потеряна , если бы ConvertFrom-Json
перечислил пустой массив, учитывая, что тогда вы не сможете отличить это от пустого ввода JSON ("" | ConvertFrom-Json
).
Это напряжение обсуждается в этой проблеме GitHub .
Консенсус заключается в том, что оба варианта использования являются законными и что у пользователей должен быть выбор между двумя вариантами поведения - перечислением или нет - с помощью переключателя ]; Начиная с PowerShell Core 6.2.0, формальное решение не было принято, но если должна быть сохранена обратная совместимость, это должно быть поведение перечисления, которое является opt-in (например, -Enumerate
) . [+1162]
Если перечисление желательно, пока - обходной путь - это принудительное перечисление , просто заключив вызов ConvertFrom-Json
в (...)
(который преобразует его в [ 1150] выражение , а выражения всегда перечисляют выходные данные команды при использовании в конвейере):
[112]
Что касается того, что вы пытались : ваша попытка получить доступ к Свойство .Count
и ваше использование @(...)
:
[113] С вызовом ConvertFrom-Json
, заключенным в (...)
, ваша общая команда возвращает «ничто»: свободно говоря, $null
, но, точнее, «массив-значение ноль», который является синглтоном [System.Management.Automation.Internal.AutomationNull]::Value
, который указывает на отсутствие вывода команды. (В большинстве случаев последний обрабатывается так же, как $null
, хотя, в частности, не используется в качестве входных данных конвейера.)
[System.Management.Automation.Internal.AutomationNull]::Value
не имеет свойства .Count
, поэтому с [ 1123] или выше, вы получите ошибку The property 'count' cannot be found on this object.
.
Оборачивая весь конвейер в @(...)
, оператор подвыражения массива, вы гарантируете обработку выходных данных как массива , который с помощью [null output со значением массива создает пустой массив - что имеет свойство .Count
.
Обратите внимание, что вы должны иметь возможность вызывать .Count
для $null
и [System.Management.Automation.Internal.AutomationNull]::Value
, учитывая, что PowerShell добавляет свойство .Count
в каждый [ 1154] объект, если он еще не существует, включая скаляры, в похвальном стремлении унифицировать обработку коллекций и скаляров.
То есть с Set-StrictMode
, установленным на -Off
(по умолчанию) или на -Version 1
, следующее работает и - разумно - возвращает 0
:
# With Set-StrictMode set to -Off (the default) or -Version 1:
# $null sensibly has a count of 0.
PS> $null.Count
0
# So does the "array-valued null", [System.Management.Automation.Internal.AutomationNull]::Value
# `. {}` is a simple way to produce it.
PS> (. {}).Count # `. {}` outputs
0
[ 1170] То, что вышеупомянутое в настоящее время не не работает с Set-StrictMode -Version 2
или выше (по состоянию на PowerShell Core 6.2.0), следует считать ошибкой , как сообщалось в , в этом выпуске GitHub (не менее Джеффри Сновером). .name -eq "Baz" }
$y.Count # Fails with Set-StrictMode -Version 2 or higher
С вызовом ConvertFrom-Json
, заключенным в (...)
, ваша общая команда возвращает «ничто»: свободно говоря, $null
, но, точнее, «массив-значение ноль», который является синглтоном [System.Management.Automation.Internal.AutomationNull]::Value
, который указывает на отсутствие вывода команды. (В большинстве случаев последний обрабатывается так же, как $null
, хотя, в частности, не используется в качестве входных данных конвейера.)
[System.Management.Automation.Internal.AutomationNull]::Value
не имеет свойства .Count
, поэтому с [ 1123] или выше, вы получите ошибку The property 'count' cannot be found on this object.
.
Оборачивая весь конвейер в @(...)
, оператор подвыражения массива, вы гарантируете обработку выходных данных как массива , который с помощью [null output со значением массива создает пустой массив - что имеет свойство .Count
.
Обратите внимание, что вы должны иметь возможность вызывать .Count
для $null
и [System.Management.Automation.Internal.AutomationNull]::Value
, учитывая, что PowerShell добавляет свойство .Count
в каждый [ 1154] объект, если он еще не существует, включая скаляры, в похвальном стремлении унифицировать обработку коллекций и скаляров.
То есть с Set-StrictMode
, установленным на -Off
(по умолчанию) или на -Version 1
, следующее работает и - разумно - возвращает 0
:
# With Set-StrictMode set to -Off (the default) or -Version 1:
# $null sensibly has a count of 0.
PS> $null.Count
0
# So does the "array-valued null", [System.Management.Automation.Internal.AutomationNull]::Value
# `. {}` is a simple way to produce it.
PS> (. {}).Count # `. {}` outputs
0
[ 1170] То, что вышеупомянутое в настоящее время не не работает с Set-StrictMode -Version 2
или выше (по состоянию на PowerShell Core 6.2.0), следует считать ошибкой , как сообщалось в , в этом выпуске GitHub (не менее Джеффри Сновером). .name -eq "Baz" }
ConvertFrom-Json
удивительно в контексте PowerShell - командлеты обычно перечисляют несколько выходов - но [1175 ] имеет смысл в контексте анализа JSON ; в конце концов, информация была бы потеряна , если бы ConvertFrom-Json
перечислил пустой массив, учитывая, что тогда вы не сможете отличить это от пустого ввода JSON ("" | ConvertFrom-Json
).
Это напряжение обсуждается в этой проблеме GitHub .
Консенсус заключается в том, что оба варианта использования являются законными и что у пользователей должен быть выбор между двумя вариантами поведения - перечислением или нет - с помощью переключателя ]; Начиная с PowerShell Core 6.2.0, формальное решение не было принято, но если должна быть сохранена обратная совместимость, это должно быть поведение перечисления, которое является opt-in (например, -Enumerate
) . [+1162]
Если перечисление желательно, пока - обходной путь - это принудительное перечисление , просто заключив вызов ConvertFrom-Json
в (...)
(который преобразует его в [ 1150] выражение , а выражения всегда перечисляют выходные данные команды при использовании в конвейере):
# (...) around the ConvertFrom-Json call forces enumeration of its output.
# The empty array has nothing to enumerate, so the Where script block is never invoked.
("[]" | ConvertFrom-Json) | Where { С пустым массивом в качестве прямого входного конвейера, ничего не передается по конвейеру , потому что массив нумеруется , перечисляется , и поскольку перечислять нечего - пустой массив не имеет элементов - блок скрипта Where
никогда не выполняется:
[110] В отличие от этого, "[]" | ConvertFrom-Json
создает пустой массив как один выходной объект вместо того, чтобы перечислять его (несуществующие) элементы, потому что ConvertFrom-Json
по проекту не перечисляет элементы массивов, которые он выводит ; это эквивалентно: поведение
[111] ConvertFrom-Json
удивительно в контексте PowerShell - командлеты обычно перечисляют несколько выходов - но [1175 ] имеет смысл в контексте анализа JSON ; в конце концов, информация была бы потеряна , если бы ConvertFrom-Json
перечислил пустой массив, учитывая, что тогда вы не сможете отличить это от пустого ввода JSON ("" | ConvertFrom-Json
).
Это напряжение обсуждается в этой проблеме GitHub .
Консенсус заключается в том, что оба варианта использования являются законными и что у пользователей должен быть выбор между двумя вариантами поведения - перечислением или нет - с помощью переключателя ]; Начиная с PowerShell Core 6.2.0, формальное решение не было принято, но если должна быть сохранена обратная совместимость, это должно быть поведение перечисления, которое является opt-in (например, -Enumerate
) . [+1162]
Если перечисление желательно, пока - обходной путь - это принудительное перечисление , просто заключив вызов ConvertFrom-Json
в (...)
(который преобразует его в [ 1150] выражение , а выражения всегда перечисляют выходные данные команды при использовании в конвейере):
[112]
Что касается того, что вы пытались : ваша попытка получить доступ к Свойство .Count
и ваше использование @(...)
:
$y = ("[]" | ConvertFrom-Json) | Where { С пустым массивом в качестве прямого входного конвейера, ничего не передается по конвейеру , потому что массив нумеруется , перечисляется , и поскольку перечислять нечего - пустой массив не имеет элементов - блок скрипта Where
никогда не выполняется:
[110] В отличие от этого, "[]" | ConvertFrom-Json
создает пустой массив как один выходной объект вместо того, чтобы перечислять его (несуществующие) элементы, потому что ConvertFrom-Json
по проекту не перечисляет элементы массивов, которые он выводит ; это эквивалентно: поведение
[111] ConvertFrom-Json
удивительно в контексте PowerShell - командлеты обычно перечисляют несколько выходов - но [1175 ] имеет смысл в контексте анализа JSON ; в конце концов, информация была бы потеряна , если бы ConvertFrom-Json
перечислил пустой массив, учитывая, что тогда вы не сможете отличить это от пустого ввода JSON ("" | ConvertFrom-Json
).
Это напряжение обсуждается в этой проблеме GitHub .
Консенсус заключается в том, что оба варианта использования являются законными и что у пользователей должен быть выбор между двумя вариантами поведения - перечислением или нет - с помощью переключателя ]; Начиная с PowerShell Core 6.