我的脚本的输入参数是日期或数字。这是一个工作正常的脚本,所以你可以看到我想要做的事情:
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。
这是一个错误吗?它是按设计的吗?
答案 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...)
的更清楚区分/替代;有时是“!”迷失了扫描一堆代码:)