我有一个脚本,该脚本接受开始日期和开始时间作为单独的参数。如果未提供开始日期,则假定他们希望该日期为今天,如果没有开始时间,则假定其应为“现在是任何时间”。
我不想(太多)限制用户输入日期或时间的方式。例如,我希望他们能够输入do -StartDate (Get-Date)
,所以我需要能够接受该对象(包括时间),然后,因为没有输入StartTime,所以我需要替换任何时间当前时间的对象。
我想说的是,如果$StartDate
变量中有一个时间,然后使用它,但是如果他们有-StartDate 07/10/2018
,那么我仍然需要添加时间。
经过一些搜索,这是我尝试过的结果:
PS C:\> Get-Date
Tuesday, July 10, 2018 3:15:58 PM
PS C:\> $StartDate = (Get-Date).AddDays(1)
>> $StartTime = [DateTime]::ParseExact((Get-Date -Format HH:mm).ToString(),"HH:mm",[System.Globalization.CultureInfo]::InvariantCulture)
>> [datetime]$StartDate = $StartDate
>> $StartDate = $StartDate.Add([System.Timespan]::Parse($StartTime))
>> $StartDate
Exception calling "Parse" with "1" argument(s): "String was not recognized as a valid TimeSpan."
At line:4 char:1
+ $StartDate = $StartDate.Add([System.Timespan]::Parse($StartTime))
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : FormatException
Wednesday, July 11, 2018 3:16:10 PM
所以,我认为问题是,“我该如何花费特定的时间并将其插入日期时间对象?”或者也许有更好的方法可以实现我的目标,那也很酷。
谢谢。
答案 0 :(得分:3)
您始终可以通过Get-Date
的各个参数来构造日期,例如
Get-Date -Hour 8 -Minute 30
将为您提供今天的日期,时间为8:30。
您还可以像这样仅获取DateTime
值的日期部分:
$today = (Get-Date).Date
添加几天(或只有几天)
$tomorrow = $today.AddDays(1)
,然后添加所需的时间跨度:
$time = New-Timespan -Hour 8 -Minute 30
$tomorrow.Add($time)
也可以采用菊花链式连接:
$time = New-Timespan -Hour 8 -Minute 30
(Get-Date).Date.AddDays(1).Add($time)
在您的特定情况下,您可以将开始日期作为DateTime
值,剥离时间,然后添加时间跨度,例如通过字符串参数:
Param(
[Parameter(Mandatory=$true)]
[DateTime]$StartDate,
[Parameter(Mandatory=$true)]
[String]$StartTime
)
$StartDate.Date.Add([Timespan]::Parse($StartTime))
并像这样调用它:
foo -StartDate (Get-Date) -StartTime '8:30'
否则您将在小时和分钟中使用不同的参数:
Param(
[Parameter(Mandatory=$true)]
[DateTime]$StartDate,
[Parameter(Mandatory=$true)]
[ValidateRange(0,23)]
[Integer]$Hour,
[Parameter(Mandatory=$false)]
[ValidateRange(0,59)]
[Integer]$Minute = 0
)
$StartDate.Date.Add((New-Timespan -Hour $Hour -Minute $Minute))
并像这样调用脚本/函数:
foo -StartDate (Get-Date) -Hour 8 -Minute 30
答案 1 :(得分:0)
您可以使用$StartDate = (Get-Date).Date
将DateTime对象的时间部分清零。
要仅获取DateTime对象的时间部分(作为TimeSpan对象返回),可以使用(Get-Date).TimeOfDay
要测试用户是否给您一个包括日期在内的完整日期(如果未加上当前时间),可以为您解决这个问题:
if ($StartDate.TimeOfDay -eq [TimeSpan]::Zero) {
$StartDate = $StartDate.AddSeconds($StartTime.TotalSeconds)
}
$StartDate
答案 2 :(得分:0)
使用Ansgar Wiechers的建议,此修改后的功能可以按照我希望的方式工作:
function foo {
Param(
[Parameter(Mandatory = $true)]
[DateTime]$StartDate,
[String]$StartTime
)
If (-NOT($StartTime)) {
$currentTime = Get-Date
$StartDate.Date.Add((New-Timespan -Hour $currentTime.Hour -Minute $currentTime.Minute))
}
Else {
$StartDate.Date.Add([Timespan]::Parse($StartTime))
}
}
# Tomorrow, at the current time
foo -StartDate (Get-Date).AddDays(1)
# Tomorrow at 13:30
foo -StartDate (Get-Date).AddDays(1) -StartTime '13:30'
# July 5, 2018 at the current time
foo -StartDate "07-05-2018"