Передать нулевой параметр datetime в powershell - PullRequest
1 голос
/ 16 октября 2019

Итак, у меня есть скрипт powershell, который принимает регион и дату и время, а внутри скрипта он вызывает хранимую процедуру. Процедура store принимает два входных региона и дату и время, отметка даты и времени всегда равна нулю. Как мне разобрать это.

function Reset{

param ([string]$region,[nullable[Datetime]]$statustimestamp)

        $conn = New-Object System.Data.SqlClient.SqlConnection("Server=SQL,15010; Database='STG';User ID=SVC;Password=password;Integrated Security=FALSE")
        $conn.Open()
        $cmd = $conn.CreateCommand()
        $cmd.CommandText = "dbo.Reset'$region' ,'$statustimestamp'"
        $adapter = New-Object System.Data.SqlClient.SqlDataAdapter($cmd)
        $dataset = New-Object System.Data.DataSet
        [void]$adapter.Fill($dataset)
        $dataset.tables[0]
        $cmd.CommandText    
        $dataset.Tables[0] | Export-CSV M:\MyReport.csv -encoding UTF8 -NoTypeInformation    
        Write-Host 'New report M:\MyReport.csv has been successfully generated' 
    }

Я выполняю это как

Rest -region IN -statustimestamp NULL

, и я получаю следующую ошибку

Reset : Cannot process argument transformation on parameter 'statustimestamp'. Cannot convert value "NULL" to type "System.DateTime". Error: 
"The string was not recognized as a valid DateTime. There is an unknown word starting at index 0."
At line:1 char:59
+ Reset -region AU -statustimestamp NULL
+                                                           ~~~~
    + CategoryInfo          : InvalidData: (:) [Reset], ParameterBindingArgumentTransformationException
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,Reset

Ответы [ 2 ]

2 голосов
/ 16 октября 2019

Null в PowerShell представлен $null, а не NULL, поэтому в сообщении об ошибке говорится, что строку NULL нельзя преобразовать в (обнуляемую) DateTime.

Rest -region IN -statustimestamp $null

Вы также можете вообще пропустить параметр -statustimestamp.

1 голос
/ 17 октября 2019

В дополнение к полезному ответу 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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...