Share via


Расширенные Функции (Advanced Functions) и Test-LeapYear.ps1

Добро пожаловать в CTP3! В CTP3 поразительное количество очень важных вещей, но я хотел бы, чтобы каждый начал использовать как можно скорее Расширенные Функции (Advanced Functions). В CTP2 мы назвали это командлетами. Мы прекратили использовать этот термин, а взамен стали говорить о функциях наделенных особыми способностями. Может казаться неправильным использовать название «Расширенные функции» («Advanced Functions»), лишь добавив одну строку в ваш скрипт. Вы можете быть удивлены тем, что одна строка может дать вам; но мы покажем это позже. Этот пост резюмирует, на каой стадии сейчас находится развитие функций, и дает понять, какие великолепные возможности предоставляют расширенные функции. Расширенные функции – это НАМНОГО больше, чем я покажу вам здесь. Вы получите немыслимое количество возможностей небольшим количеством дополнительного кода.

Забегая вперед, я думаю, что сообщество должно договориться, что функции, публикуемые для других людей, должны быть «Расширенными Функциями».

Этот пост получился несколько многословным, но я очень надеюсь что вы сможете дочитать его до конца и овладеть приемами работы с «Расширенными Функциями». Они изменят все. Если читать вам не хочется то вы можете начать экспериментировать с этими функциями уже сейчас. Я присоединил ZIP-файл, который содержит файлы Test-LeapYear.ps1 и demo-test-leapyear.txt которые вы можете запустить с помощью моего сценария Start-Demo. Иначе говоря – инвестируйте и вы будете вознаграждены!

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

[0]PS> #Функции могут быть простыми
[1]PS> function Test-LeapYear {[DateTime]::IsLeapYear($args[0])}

[2]PS> Test-LeapYear 2008
True

[3]PS> # Но простота – спорный вопрос
[4]PS> # Возникают проблемы с удобством чтения
[5]PS> # Во всяком случае, что такое $args[0] ?
[6]PS> # Также нет проверки типов для параметров
[7]PS> Test-LeapYear ThisYear
Start-Demo : Cannot convert argument "0", with value: "ThisYear", for "IsLe
apYear" to type "System.Int32": "Cannot convert value "ThisYear" to type "S
ystem.Int32". Error: "Input string was not in a correct format.""
At line:1 char:11
+ start-demo <<<< .\demo-Test-LeapYear.ps1
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorE
xception
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExce
ption,Start-Demo

[8]PS> # Нет проверки на количество аргументов
[9]PS> Test-LeapYear 2008 2009 2010 2011
True

[10]PS> ##############################################
[11]PS> # В PowerShell версии 1.0 вы могли принять меры против таких проблем с помощью именованных параметров
[12]PS> function Test-LeapYear {param([Int]$Year=[DateTime]::Now.Year) [Dat
eTime]::IsLeapYear($Year)}

[13]PS> # Теперь вы используете переменные, чьи имена самодокументируемы
[14]PS> # Вы получаете те же функции, что и раньше
[15]PS> Test-LeapYear 2008
True

[16]PS> # Но сейчас вы также получаете ИМЕНОВАННЫЕ параметры, которые делают это
[17]PS> # даже более самодокументируемо
[18]PS> Test-LeapYear -Year 2008
True

[19]PS> # Теперь у вас есть проверка типа для параметра
[20]PS> Test-LeapYear ThisYear
Start-Demo : Cannot process argument transformation on parameter 'Year'. Ca
nnot convert value "ThisYear" to type "System.Int32". Error: "Input string
was not in a correct format."
At line:1 char:11
+ start-demo <<<< .\demo-Test-LeapYear.ps1
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorE
xception
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExce
ption,Start-Demo

[21]PS> # Но все еще нет проверки на количество аргументов
[22]PS> Test-LeapYear 2008 2009 2010 2011
True

[23]PS> # Конечно, вы могли помочь себе сами, как умеете

[24]PS> ##########################################
[25]PS> #
[26]PS> # Но теперь у вас есть Расширенные Функции:
[27]PS> Get-Content .\Test-LeapYear.ps1
<#
.Synopsis
Определяет, является ли год високосным.
.Description
Это простая функция для демонстрации возможностей Расширенных Функций
PowerShell V2 сообщает, является ли год високосным.
.Parameter Year
Какой год вы хотите проверить?
.Example
PS> Test-LeapYear 2008

.ReturnValue
[Boolean]

.Link
about_functions
about_functions_advanced
about_functions_advanced_methods
about_functions_advanced_parameters

.Notes
NAME: Verb-Noun
AUTHOR: NTDEV\jsnover
LASTEDIT: 12/22/2008 20:39:07
#Requires -Version 2.0
#>

param(
[Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$true)]
[Int]$Year
)

Process
{
[DateTime]::IsLeapYear($Year)
}#Process

[28]PS> # Вы делаете много чепухи, как это показано выше, но что вы получаете:
[29]PS> # Проверяется, что вы указываете правильное количество параметров:
[30]PS> .\Test-LeapYear 2008 2009 2010 2011
Start-Demo : A positional parameter cannot be found that accepts argument '
2009'.
At line:1 char:11
+ start-demo <<<< .\demo-Test-LeapYear.ps1
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorE
xception
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExce
ption,Start-Demo

[31]PS> # Поддерживается конвейеризация
[32]PS> 2008,2009,2010,2011 | .\Test-LeapYear
True
False
False
False

[33]PS> # Я не могу продемонстрировать это здесь, но также поддерживается автодополнение имен параметров по Tab
[34]PS> # И самое главное, поддерживается HELP
[35]PS> Get-Help .\Test-LeapYear -full

NAME
C:\temp\Test-LeapYear.ps1

SYNOPSIS
Определяет, является ли год високосным.

SYNTAX
C:\temp\Test-LeapYear.ps1 [-Year] [<Int32>] [-Verbose] [-Debug] [-Error
Action [<ActionPreference>]] [-WarningAction [<ActionPreference>]] [-Er
rorVariable [<String>]] [-WarningVariable [<String>]] [-OutVariable [<S
tring>]] [-OutBuffer [<Int32>]] [<CommonParameters>]

DETAILED DESCRIPTION
Это простая функция для демонстрации возможностей Расширенных Функций
PowerShell V2 сообщает, является ли год високосным.

PARAMETERS
-Year
Какой год вы хотите проверить?

Required? true
Position? 0
Default value
Accept pipeline input? true (ByValue)
Accept wildcard characters?

    <CommonParameters>
This cmdlet supports the common parameters: -Verbose, -Debug,
-ErrorAction, -ErrorVariable, -WarningAction, -WarningVariable,
-OutBuffer and -OutVariable. For more information, type,
"get-help about_commonparameters".

INPUT TYPE

RETURN TYPE
[Boolean]

NOTES

        NAME: Verb-Noun
AUTHOR: NTDEV\jsnover
LASTEDIT: 12/22/2008 20:39:07
#Requires -Version 2.0

    -------------------------- EXAMPLE 1 --------------------------

    PS> Test-LeapYear 2008

RELATED LINKS
about_functions
about_functions_advanced
about_functions_advanced_methods
about_functions_advanced_parameters

[36]PS> # Обратите внимание: хотя был описан лишь один параметр, на самом деле,
[37]PS> # их 9!
[38]PS> # Они создаются средствами PowerShell.
[39]PS> (Get-Command .\Test-LeapYear.ps1).Parameters

Key Value
--- -----
Year System.Management.Automation.Param...
Verbose System.Management.Automation.Param...
Debug System.Management.Automation.Param...
ErrorAction System.Management.Automation.Param...
WarningAction System.Management.Automation.Param...
ErrorVariable System.Management.Automation.Param...
WarningVariable System.Management.Automation.Param...
OutVariable System.Management.Automation.Param...
OutBuffer System.Management.Automation.Param...

[40]PS> # Давайте посмотрим их в действии
[41]PS> 2008,2009,2010 |.\Test-LeapYear.ps1 -OutVariable Results
True
False
False

[42]PS> $results
True
False
False

[43]PS> 2008,"Burp",2010 |.\Test-LeapYear.ps1 -ErrorAction Stop
True
Start-Demo : Command execution stopped because the preference variable "Err
orActionPreference" or common parameter is set to Stop: The input object ca
nnot be bound to any parameters for the command either because the command
does not take pipeline input or the input and its properties do not match a
ny of the parameters that take pipeline input.
At line:1 char:11
+ start-demo <<<< .\demo-Test-LeapYear.ps1
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorE
xception
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorExce
ption,Start-Demo

[44]PS> 2008,"Burp",2010 |.\Test-LeapYear.ps1 -ErrorAction SilentlyContinue

True
False