В дополнение к полезному ответу dee-see :
Примечание: Однако ваши параметры объявлены, $PSBoundParameters.ContainsKey('<parameter-name>')
внутри скрипта / функции сообщает вам, был ли аргумент явно передан с данным параметром ( значение по умолчанию не считается);например, при вызове в вашем вопросе (если бы он был успешным), $PSBoundParameters.ContainsKey('statustimestamp')
будет означать $true
.
Если вы хотите, чтобы значение вашего параметра было $null
по пропуску :
Объявите ваш параметр просто как [Datetime] $statustimestamp
и не передавайте ему аргумент при вызове;$statustimestamp
будет затем неявно будет $null
.
# Declare a parameter in a script block (which works like a function)
# and invoke the script block without an argument for that parameter:
PS> & { param([Datetime] $statustimestamp) $null -eq $statustimestamp }
True # $statustimestamp was $null
Если вы хотите поддержать , явно передавая $null
какаргумент:
Это может быть необходимо, если вы объявляете обязательный параметр, но вы хотите разрешить $null
в качестве явного сигнала о том, что следует использовать значение по умолчанию.
К сожалению, специфика объявления параметра в настоящее время зависит от того, является ли тип данных параметра ссылочным типом (например, [string]
или [System.IO.FileInfo]
) или тип значения (например, [int]
или [datetime]
) .
Вы можете проверить свойство .IsValueType
данного типа, чтобы узнать, является ли он типом значения ($true)
или ссылочным типом). ($false
); например: [datetime].IsValueType
выход $true
).
Если тип параметра имеет тип ссылки , вы можете использовать [AllowNull()]
attribute:
PS> & {
param(
[AllowNull()]
[Parameter(Mandatory)]
[System.IO.FileInfo] $Foo # System.IO.FileInfo is a *reference type*
)
$null -eq $Foo
} -Foo $null
True # $Foo was $null
К сожалению, такая же техника не работает с типами значений , такими как [DateTime]
, поэтому ваш в годПараметр rameter действительно должен быть набран как [Nullable[DateTime]
, как в вашем вопросе:
PS> & {
param(
[Parameter(Mandatory)]
[AllowNull()] # Because the parameter is mandatory, this is *also* needed.
[Nullable[DateTime]] $Foo # System.DateTime is a *value type*
)
$null -eq $Foo
} -Foo $null
True # $Foo was $null
Примечание. Эти требования - необходимость уделять внимание разнице между типами значений и ссылочными типами и необходимость использования[Nullable[T]]
type - неясен и нехарактерен для PowerShell.
Отказ от этих требований в пользу унифицированного подхода (заставляя его работать для типов значений так же, как он уже работает для ссылочных типов)) является темой этого предложения на GitHub .