【问题标题】:How to check if a DateTime value is not null or empty?如何检查 DateTime 值是否不为空或为空?
【发布时间】:2023-03-30 21:05:01
【问题描述】:

我想检查 DateTime 字段是否不是空\null 字符串。如果 datetime 字段不为空,那么我会做一些事情。

[DateTime]$expdate = Read-Host "Expiration Date? MM/DD/YYYY"
$newexpdate = $expdate.AddDays(1)
if (!([DateTime]$expdate -eq "")) {
    Write-Host -ForegroundColor Green $($newexpdate) "Date Time entered"
}

这是我的错误信息:

无法将值“”转换为类型“System.DateTime”。错误:“字符串不是 识别为有效的日期时间。” 在行:1 字符:2 + [DateTime]$expdate = 读取主机“到期日期?MM/DD/YYYY” + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~ + CategoryInfo : MetadataError: (:) [], ArgumentTransformationMetadataException +fullyQualifiedErrorId:RuntimeException`

如何检查字段是否不是字符串而是DateTime 对象?

【问题讨论】:

  • if ($expdate) {"Has value"} else {"No value"} 一个空字符串的计算结果为$false
  • 可以查看数据类型:$expDate -is [datetime]
  • 将变量声明为[datetime]$foo 会强制将对其的任何赋值转换为datetime。如您所见,如果它不可转换,则会引发错误。不要在$foo上声明类型,然后你可以测试一个空字符串。

标签: powershell datetime


【解决方案1】:

当您可以向函数或脚本声明强制DateTime-type 参数时,为什么要提示用户输入?如果缺少参数,PowerShell 将提示用户输入日期和时间,用户可以在运行时输入。 (如果使用Read-Host,则无法自动化。)

【讨论】:

    【解决方案2】:

    没有空的 [DateTime] 值,它可以是 $null 或 datetime 值。

    Read-Host 返回字符串类型。您要做的是将字符串值分配给 [DateTime] 类型,这将导致错误。

    你可以这样重写你的代码:

    $expdate = Read-Host "Expiration Date? MM/DD/YYYY"
    if (![string]::IsNullOrEmpty($expdate))) {
       #add logic to check $expdate is valid datetime
       #then you can do this
       $newexpdate = ([DateTime]$expdate).AddDays(1)
       Write-Host -ForegroundColor Green $($newexpdate) "Date Time entered"
    }
    

    【讨论】:

    • 这并没有回答问题......它只是重申了它。 [皱眉]
    【解决方案3】:

    您的逻辑没有多大意义,但这是我认为您正在尝试做的事情(如下)。要直接解决您的最后一个问题,您可以使用 -is-isNot 运算符测试对象的类型,这将根据匹配返回 $True\ $False。运算符的另一侧可以是字符串或类型加速器,即[DateTime]'10/10/2010' -is 'DateTime'[DateTime]'10/10/2010' -is [DateTime] 都计算为$True

    Do
    {
        $ExpDate = Read-Host -Prompt 'Expiration date? MM/DD/YYYY'
    } Until ($ExpDate -match '\d{1,2}\/\d{1,2}\/\d{2,4}')
    
    $NewExpDate = ([DateTime]$ExpDate).AddDays(1)
    
    If ($ExpDate)
    {
        Write-Host "$NewExpDate Date Time entered." -ForegroundColor 'Green'
    }
    

    【讨论】:

    • 首先感谢您的回答。我的问题是:如果用户在没有输入“Read-Host -Prompt 'Expiration date?”的情况下按回车键?什么都没有,如果用户点击输入“Read-Host -Prompt 'Expiration date?”然后我会做的事情。
    • @Arbelac 你可以做If ($ExpDate) { do stuff } Else { error handling }
    • 但是如果用户在没有输入“$ExpDate = Read-Host -Prompt 'Expiration date? MM/DD/YYYY'”的情况下点击回车,我会收到以下错误:键入“System.约会时间”。错误:“字符串未被识别为有效的日期时间。”
    • @Arbelac 在对值进行验证之前不要尝试转换为 datetime。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多