С пустым массивом в качестве прямого входного конвейера, ничего не передается по конвейеру , потому что массив нумеруется , перечисляется , и поскольку перечислять нечего - пустой массив не имеет элементов - блок скрипта 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
по проекту не перечисляет элементы массивов, которые он выводит ; эт
Вы пытались гуглить?
Это, кажется, ответ: http://lists.apple.com/archives/scitech/2005/Aug/msg00004.html
sysctl () действительно работает, просто необходимо выбрать hw.memsize вместо hw.physmem. hw.memsize, даст Вам uint64_t, таким образом, проблема номера 32 битов.
Из Получение данных о профиле системы Mac из оболочки :
Использовать system_profiler
.
Ответ - использовать sysctl для получения hw.memsize, как было предложено в предыдущем ответе. Вот реальный код для этого:
#include <sys/types.h>
#include <sys/sysctl.h>
...
int mib[2];
int64_t physical_memory;
size_t length;
// Get the Physical memory size
mib[0] = CTL_HW;
mib[1] = HW_MEMSIZE;
length = sizeof(int64_t);
sysctl(mib, 2, &physical_memory, &length, NULL, 0);