Благодаря режиму выражения PowerShell, PowerShell имеет несколько хороших способов десериализации объектов, таких как:
Мое общее ожидание состоит в том, что результат данного выражения должен совпадать с использованием одной из перечисленных выше команд десериализации для той же сериализованной версии этого выражения (для справки см. ConvertTo-Expression ответ на 'Сохранить хэш-таблицу в нотации объектов PowerShell (PSON)' вопрос).
Другими словами:
<Expression> <=> Invoke-Command {<Expression>} <=> &([ScriptBlock]::Create('<Expression>'))
<Expression> <=> Invoke-Expression '<Expression>'
Примеры:
Get-ChildItem <=> &{Get-ChildItem}
Get-ChildItem <=> Invoke-Command {Get-ChildItem}
Get-ChildItem <=> Invoke-Expression 'Get-ChildItem'
1, 2, 3 <=> &{1, 2, 3}
1, 2, 3 <=> Invoke-Command {1, 2, 3}
1, 2, 3 <=> Invoke-Expression '1, 2, 3'
Это действительно кажется верным в основном для каждого выражения, но из-за того, что PowerShell разворачивает (перечисляет) выходные данные по умолчанию, это определение отклоняется в случае, если выражение содержит массив с одним элементом:
,1 <≠> Invoke-Command {,1}
,1 <≠> Invoke-Expression ',1'
,"Test" <≠> Invoke-Command {,"Test"}
,"Test" <≠> Invoke-Expression ',"Test"'
@("Test") <≠> Invoke-Command {@("Test")}
@("Test") <≠> Invoke-Expression '@("Test")'
,@("Test") <≠> Invoke-Command {,@("Test")}
,@("Test") <≠> Invoke-Expression ',@("Test")'
Есть ли способ предотвратить развертывание выражений при их вызове (десериализации)?
Я рассматриваю запрос на параметр -NoEnumerate
(аналогично командлету Write-Output
) для Invoke-Expression
на PowerShell GitHub , но это все равно оставит вопрос / вопрос для оператора вызова и точечного поиска, которые не поддерживают параметры ...