Почему PowerShell применяет предикат `где` к пустому списку

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

2
задан mklement0 9 April 2019 в 15:06
поделиться

2 ответа

Почему PowerShell применяет предикат 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 применяет предикат Where к пустому списку?

Поскольку ConvertFrom-Json говорит Where-Object не пытаться перечислять свои выходные данные. [1122 ]

Поэтому PowerShell пытается получить доступ к свойству name в самом пустом массиве, как если бы мы делали:

[110]

Когда вы заключаете ConvertFrom-Json в скобки, powershell интерпретирует его как отдельный конвейер , который выполняется и завершает до , любой вывод может быть отправлен на Where-Object, и поэтому Where-Object может не знать, что ConvertFrom-Json хотел, чтобы он рассматривал массив как таковой .


Мы можем воссоздать это поведение в powershell, явно вызвав Write-Output с набором параметров переключателя -NoEnumerate:

[111]

Write-Output -NoEnumerate внутренне вызывает Cmdlet.WriteObject(arg, false), что, в свою очередь, вызывает время выполнения до , а не , перечисляет значение arg во время привязки параметра к нижестоящему командлету (в вашем случае Where-Object)


Почему это желательно? [ 1127]

В конкретном контексте синтаксического анализа 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 применяет предикат Where к пустому списку?

Поскольку ConvertFrom-Json говорит Where-Object не пытаться перечислять свои выходные данные. [1122 ]

Поэтому PowerShell пытается получить доступ к свойству name в самом пустом массиве, как если бы мы делали:

[110]

Когда вы заключаете ConvertFrom-Json в скобки, powershell интерпретирует его как отдельный конвейер , который выполняется и завершает до , любой вывод может быть отправлен на Where-Object, и поэтому Where-Object может не знать, что ConvertFrom-Json хотел, чтобы он рассматривал массив как таковой .


Мы можем воссоздать это поведение в powershell, явно вызвав Write-Output с набором параметров переключателя -NoEnumerate:

[111]

Write-Output -NoEnumerate внутренне вызывает Cmdlet.WriteObject(arg, false), что, в свою очередь, вызывает время выполнения до , а не , перечисляет значение arg во время привязки параметра к нижестоящему командлету (в вашем случае Where-Object)


Почему это желательно? [ 1127]

В конкретном контексте синтаксического анализа JSON такое поведение действительно может быть желательным:

$data = '[]', '[]', '[]', '[]' |ConvertFrom-Json

Если бы я не ожидал ровно 5 объектов из ConvertFrom-Json теперь, когда я передал 5 допустимых JSON документы на это? : -) [тысяча сто двадцать девять].nonexistingproperty = 'meh' }

Write-Output -NoEnumerate внутренне вызывает Cmdlet.WriteObject(arg, false), что, в свою очередь, вызывает время выполнения до , а не , перечисляет значение arg во время привязки параметра к нижестоящему командлету (в вашем случае Where-Object)


Почему это желательно? [ 1127]

В конкретном контексте синтаксического анализа JSON такое поведение действительно может быть желательным:

$data = '[]', '[]', '[]', '[]' |ConvertFrom-Json

Если бы я не ожидал ровно 5 объектов из ConvertFrom-Json теперь, когда я передал 5 допустимых JSON документы на это? : -) [тысяча сто двадцать девять]

0
ответ дан mklement0 9 April 2019 в 15:06
поделиться

С пустым массивом в качестве прямого входного конвейера, ничего не передается по конвейеру , потому что массив нумеруется , перечисляется , и поскольку перечислять нечего - пустой массив не имеет элементов - блок скрипта 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.

0
ответ дан mklement0 9 April 2019 в 15:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: