Откуда это взялось?

Доводилось ли вам раньше задавать себе вопрос: «откуда ЭТО взялось?»

В 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

Перевод: Виктор Горбунков