Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Доводилось ли вам раньше задавать себе вопрос: «откуда ЭТО взялось?»
В 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
Перевод: Виктор Горбунков