如何检查字符串是否包含日期?

时间:2010-01-06 17:22:22

标签: powershell

我的脚本的输入参数是日期或数字。这是一个工作正常的脚本,所以你可以看到我想要做的事情:

param($date = (Get-Date))

if ($date -match "^\d+$")
{  
    $date = (Get-Date).AddDays($date)
} 
elseif ($date -as [DateTime]) 
{
    $date = [DateTime]::Parse($date)  
}
else 
{  
    'You entered an invalid date'
    exit 1
}

这是我之前尝试 的尝试:

param($date = (Get-Date))

if ($date -as [DateTime]) 
{
    $date = [DateTime]::Parse($date)  
}
elseif ($date -match "^\d+$")
{  
    $date = (Get-Date).AddDays($date)
} 
else 
{  
    'You entered an invalid date'
    exit 1
}

当我输入一个数字时,脚本会在日期解析行中断。看起来我的“is is date”检查在给定数字时返回true。

这是一个错误吗?它是按设计的吗?

5 个答案:

答案 0 :(得分:11)

是的,您可以使用'( - as [DateTime])'检查字符串是否包含日期。原始脚本中的问题是我假设脚本输入参数是字符串。显然,数字参数会自动转换为整数,除非使用引号键入。所以,我应该写了

if ([string]$date -as [DateTime])  

强迫将可能的数字转换回字符串,正如Keith在答案中所做的那样。

同样的缺陷适用于我的整数检查。给出“10月3日”(没有引号)时脚本失败。 PS会在这里创建一个数组吗?

为什么检查成功时解析失败?约翰内斯解释说。表达

$date -as [DateTime]

指示PS将输入转换为日期。转换数字是有意义的(日期1是0001年1月1日),因此在给定数字时它不会失败。表达

[DateTime]::Parse($date)

专门解析一个字符串,所以给它一个整数没有意义并导致错误。

无论如何,使用它们都浪费我。首先,我在条件中转换为日期,只是为了抛弃结果。然后,我用不同的语法重新创建结果。我正在改变它

$date = $date -as [DateTime];
if (!$date)
{  
    'You entered an invalid date'
    exit 1
}

谢谢大家。

答案 1 :(得分:9)

您可以让.NET Framework为您提供帮助:

function ParseDate([string]$date)
{
    $result = 0
    if (!([DateTime]::TryParse($date, [ref]$result)))
    {
        throw "You entered an invalid date: $date"
     }

    $result
}

ParseDate 'June 51, 2001'

答案 2 :(得分:6)

好吧,您可以将任何整数转换为DateTime,因为DateTime只是幕后的数字。

每个DateTime都有Ticks属性,自0001-01-01以来间隔为100 ns。您可以使用这些刻度初始化DateTime,即使我到目前为止还没有找到它的用途。

PS> ([datetime]1234).Ticks
1234

但这就是为什么你可以将一个数字转换为DateTime并且它有效。这可能只是一个很晚的时间: - )

基本上,你现在在做什么,我。即首先检查一个数字是正确的方法,因为演员DateTime不足以帮助你确定它是一个日期还是数字。

答案 3 :(得分:0)

这是一个简短的选择:

filename,width,height,class,xmin,ymin,xmax,ymax
1.jpg,2048,1251,dog,706,513,743,562
2.jpg,1600,980,cat,715,157,733,181
3.jpg,2828,1828,cat,460,1530,482,1557
4.jpg,1276,1754,dog,846,517,878,563

答案 4 :(得分:0)

如果var是原始帖子中的“ DateTime”,则您可以使用“ -is”运算符返回布尔值: if( $date -is [DateTime] ) {...}

还有-isNot,作为!(...-is...)的更清楚区分/替代;有时是“!”迷失了扫描一堆代码:)