This Q&A установил, что трубопровод powershell иногда разворачивает некоторые коллекции. Предположим, что у нас есть функция, которая испускает коллекцию, которая может быть развернута, но мы не хотим, чтобы конвейер выполнял разворот. Вот пример, демонстрирующий нежелательное разворачивание:Есть ли способ для вызывающего пользователя получить выход функции powershell, не подвергая его (возможному) разворачиванию трубопровода?
Function EmitStack{
[Cmdletbinding()]
param()
process{[System.Collections.Stack]@(10,20,30)}
}
$stack = [System.Collections.Stack]@(10,20,30)
$stack.GetType()
$EmittedStack = EmitStack
$EmittedStack.GetType()
#Name BaseType
#---- --------
#Stack System.Object
#Object[] System.Array
Что мы хотим, чтобы это $EmittedStack
переменная содержит чистейший, нетронутый [System.Collections.Stack]
объект, функция помещает в трубопроводе. Вместо этого он содержит развернутые элементы стека, повторно свернутые в массив. Есть ли способ, чтобы вызывающий мог получить исходный объект, не подвергая его разворачиванию трубопровода PowerShell (и повторной прокатке)?
Разъяснение: Этот вопрос о ли абонент может получить чистейший объект, даже если он не был завернутыми в жертвенном массиве с помощью функции, прежде чем он ставит его в трубопроводе. Другими словами, я ищу решение, которое не связано с изменением функции.
Причина: Какие типы раскатали является not clearly defined in powershell что предполагает более высокую степень непредсказуемости от системы к системе, PowerShell-версия для Powershell-версии, Dotnet-версии к Dotnet-версии, и т.д. В случае, например, некоторые конвейеры среды powershell Environment неожиданно разворачиваются [System.Collections.Generic.Dictionary]
(помните, что для этого нет никаких документированных правил), это помогло бы вызывающему абоненту иметь возможность компенсировать по мере необходимости без необходимости копать код вызываемого абонента.
Я не уверен, что понимаю вашу озабоченность. Обычно разворачивание полезно. Как функция не будет знать, что она вернет то, что будет подвержено нежелательной разворачиванию? Другими словами, почему было бы неприемлемо изменить функцию? Как вызывающий, так и вызывающий должны знать, что они ожидают одного объекта, чтобы вызывающий пользователь мог снова развернуть, если захочет. –
Это только проблема, если выполняются оба следующих условия: 1.Окружение powershell изменилось так, что теперь трубопровод разворачивает типы, которые он ранее не разворачивал. 2. Этот тип испускается непрозрачным источником, как сторонняя или встроенная библиотека Microsoft. – alx9r
Powershell - это язык сценариев, и они подчеркивают производительность по надежности. Если вам нужны надежные результаты, убедитесь, что ваши скрипты работают в совершенно стабильной среде. Вы можете принудительно настроить определенную версию Powershell с помощью переключателя '-version', которого должно быть достаточно, чтобы неожиданно это произошло. Конечно, это означает, что тестирование скриптов в новой версии может быть сложной задачей, но это не общий сценарий (если он не сломался, не обновляйте его). –