Test-PSCmdlet

Всем следует приобрести хорошие навыки работы с расширенными функциями – это самый простой путь к хорошей семантике. В предыдущих сообщениях мы рассмотрели, как можно добавить несколько простых атрибутов и бесплатно получить ТОННЫ полезных вещей бесплатно. О расширенных функциях можно сказать ЗНАЧИТЕЛЬНО больше. Благодаря расширенным функциям, вы можете продвинуться ГОРАЗДО ГОРАЗДО дальше. Я не могу придумать чего либо что можно было бы сделать с помощью C# и нельзя повторить командлетами на PowerShell. Многие из этих функций доступны вам через переменную $PsCmdlet.

Так, если вы пишете коммандлет, который использует несколько ParameterSet, вам нужно быть в курсе, какой ParameterSet выбрал пользователь. Вот способ это узнать:

$PsCmdlet.ParameterSetName

Теперь у вас есть ТОННА всякого добра в функции $PSCmdlet, но поскольку она еще не слишком хорошо документирована, вопрос состоит в том, как его использовать. Вы, разумеется УЖЕ знаете ответ –

Используйте PowerShell для самостоятельного изучения и исследования (и напишите об этом в свой блог, чтобы об этом могли узнать другие)

Сегодня я написал много сценариев и не мог запомнить, как использовать $PsCmdlet для того, что я сделал, так что я решил написать функцию, которая позволит мне протестировать PsCmdlet. Я даю ее вам, чтобы вы могли использовать ее и наслаждаться ею (запомните – исследовать, изучить, написать в блог/выложить в свободный доступ).

function Test-PsCmdlet
{
<#
.Synopsis
Test/Explore the $PsCmdlet variable
.Description
This command creates a nested prompt with $PsCmdlet set so that you explore
the capabilities of the parameter.
When you write an advanced function, you use $PsCmdlet to give you access to the
PowerShell engine and a rich set of functions. Use this function to explore what
is available to you.
This command copies $PsCmdlet to $p so you can use it and reduce typing.
This is implemented by using $host.EnterNestedPrompt() which means that you have
to type EXIT to get out of this mode.

.Example
Test-PsCmdlet
.ReturnValue
None
.Link
about_functions_advanced
about_functions_advanced_methods
about_functions_advanced_parameters
.Notes
NAME: Test-PsCmdlet
AUTHOR: RugratsVista\jsnover
LASTEDIT: 01/10/2009 16:25:42
#>
[CmdletBinding()]
param()
Write-Host -ForegroundColor RED "Interactively explore `$PsCmdlet . Copied `$PsCmdlet to `$p "
Write-Host -ForegroundColor RED 'Type "Exit" to return'
$p = $pscmdlet
function Prompt {"Test-PsCmdlet> "}
$host.EnterNestedPrompt()
}

Давайте используем и изучим функцию:

PS> Test-PScmdlet
Interactively explore $PsCmdlet . Copied $PsCmdlet to $p
Type "Exit" to return
Test-PsCmdlet> $p |gm

   TypeName: System.Management.Automation.PSScriptCmdlet

Name MemberType Definition
---- ---------- ----------
CurrentProviderLocation Method System.Management.Automat...
Dispose Method System.Void Dispose()
Equals Method System.Boolean Equals(Obj...
GetDynamicParameters Method System.Object GetDynamicP...
GetHashCode Method System.Int32 GetHashCode()
GetResolvedProviderPathFromPSPath Method System.Collections.Object...
GetResourceString Method System.String GetResource...
GetType Method System.Type GetType()
GetUnresolvedProviderPathFromPSPath Method System.String GetUnresolv...
GetVariableValue Method System.Object GetVariable...
Invoke Method Invoke(), System.Collect...
ShouldContinue Method System.Boolean ShouldCont...
ShouldProcess Method System.Boolean ShouldProc...
ThrowTerminatingError Method System.Void ThrowTerminat...
ToString Method System.String ToString()
TransactionAvailable Method System.Boolean Transactio...
WriteCommandDetail Method System.Void WriteCommandD...
WriteDebug Method System.Void WriteDebug(St...
WriteError Method System.Void WriteError(Er...
WriteObject Method System.Void WriteObject(O...
WriteProgress Method System.Void WriteProgress...
WriteVerbose Method System.Void WriteVerbose(...
WriteWarning Method System.Void WriteWarning(...
CommandOrigin Property System.Management.Automat...
CommandRuntime Property System.Management.Automat...
CurrentPSTransaction Property System.Management.Automat...
Events Property System.Management.Automat...
Host Property System.Management.Automat...
InvokeCommand Property System.Management.Automat...
InvokeProvider Property System.Management.Automat...
JobRepository Property System.Management.Automat...
MyInvocation Property System.Management.Automat...
ParameterSetName Property System.String ParameterSe...
SessionState Property System.Management.Automat...
Stopping Property System.Boolean Stopping {...

Test-PsCmdlet> $p.CurrentProviderLocation

MemberType : Method
OverloadDefinitions : {System.Management.Automation.PathInfo CurrentProvide
rLocation(String providerId)}
TypeNameOfValue : System.Management.Automation.PSMethod
Value : System.Management.Automation.PathInfo CurrentProvider
Location(String providerId)
Name : CurrentProviderLocation
IsInstance : True

Test-PsCmdlet> $p.CurrentProviderLocation("FileSystem")

Path
----
C:\temp

Test-PsCmdlet> $p.CurrentProviderLocation("registry")

Path
----
HKLM:\

Test-PsCmdlet> exit
PS>

Кстати, когда вы пишете сценарий и хотите записать файл в текущий каталог, вам не следует использовать текущий каталог, поскольку в PowerShell это может быть реестр, хранилище сертификатов, хранилище настроек WSMAN и т.д.. Вам НА САМОМ ДЕЛЕ следует записать файл в текущий каталог FILESYSTEM. Вот метод, с помощью которого можно узнать текущий каталог. $psCmdlet.CurrentProviderLocation() – это метод, который возвращает текущее место для конкретного провайдера (которой вы передали в строке). Так, для получения текущего каталога filesystem следует ввести:

$psCmdlet.CurrentProviderLocation("FileSystem")

Помните – все это работает, только если у вас есть набор $psCmdlet, о котором мы говорили, обсуждая расширенные функции. Я уже упоминал, что следует всегда использовать расширенные функции? Идите в ногу с современным программированием.

Наслаждайтесь!

Джеффри Сновер (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

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