Откуда это взялось?
Доводилось ли вам раньше задавать себе вопрос: «откуда ЭТО взялось?»
В PowerShell мы постарались дать вам механизм, который можно использовать для ответов на подобные вопросы. Мы потратили для этого дополнительные ресурсы (память, циклы ЦПУ и т.д.), для нас важнее производительность ЛЮДЕЙ, использующих наши программы, а не на производительность кода. Когда что-то принимает неправильную форму, важно, как быстро человек может понять, что происходит и исправить положение.
Раньше мы немного говорили об этом, но лишь в контексте обширной информации об ошибках, которую мы собираем. Но в этом блоге я хочу обсудить другую функцию V1, а затем рассказать вам о ДРУГОМ любимом мною V2-изме.
Вы знаете, что переменные выступают в качестве устройства и с ними можно делать такие вещи:
PS> dir Variable:s*
Name Value
---- -----
ShellId Microsoft.PowerShell
А так вы пробовали?
PS> dir Variable:s* |ft Name,Description -auto
Name Description
---- -----------
ShellId The ShellID identifies the current shell. This is used by #Requires.
StackTrace
Вы об этом знали? Переменные содержат гораздо больше сведений, чем может увидеть невооруженный глаз! Вы можете задать описание переменной, используя команду Set-Variable
PS> Set-Variable X 15 -Description "This is a test"
PS> Get-Variable x |fl *
Name : x
Description : This is a test
Value : 15
Visibility : Public
Module :
ModuleName :
Options : None
Attributes : {}
Это работало, начиная с PowerShell V1, но тогда мы были не в состоянии ответить на вопрос – откуда взялась эта функция ?
Каждый раз когда я начинаю работать с PowerShell, первым делом с поvощью механизма dotsourcing я подключаю множество сценариев, которые определяют функции. Иногда я решал, что одна из постоянно используемых функций, нуждается в улучшении и должна работать иначе. Возникал вопрос, в каком файле была описана эта функция? Нормального способа ответить на этот вопрос не было. В PowerShell V2 все изменилось.
В V2 мы расширили объект SCRIPTBLOCK добавив в него параметр FILE, благодаря которому можно посмотреть в каком файле была объявлена функция. Для получения всей информации о Scriptblock, необходимо использовать флаг -FORCE в командах форматирования.
[4376:0]PS> (dir function:prompt ).scriptblock |fl *
if ($PSDebugContext)
{ "DBG>"
}
else
{
"[{0}:{1}]PS> " -f $PID, $NestedPromptLevel
}
[4376:0]PS> (dir function:prompt ).scriptblock |fl * -force
IsFilter : False
StartPosition : System.Management.Automation.PSToken
File : D:\ps\profile.ps1
Attributes : {}
Module :
Теперь мы получили все что нам нужно, и можем обращаться к этим сведениям напрямую:
[4376:0]PS> (dir function:prompt ).scriptblock.file
D:\ps\profile.ps1
PSMDTAG:FAQ: Как узнать, где определена функция?
(dir function:X).ScriptBlock.File
Экспериментируйте, не скучайте, подключайтесь!
Джеффри Сновер (Jeffrey Snover) [MSFT]
Windows Management Partner Architect
Посетите английский блог команды Windows PowerShell: https://blogs.msdn.com/PowerShell
Посетите Windows PowerShell ScriptCenter: https://www.microsoft.com/technet/scriptcenter/hubs/msh.mspx
Перевод: Виктор Горбунков