在 PowerShell 中处理日期时间

Deal with Date Time in PowerShell

我写了一个非常漂亮的 PowerShell 脚本,它与 VMware PowerCLI 一起工作,可以将几个 VM 克隆到第二个存储设备,然后在它们达到一定年龄时自动删除它们。它似乎工作得很好,直到它到达本月的 end/beginning,然后我用于日期时间的方法似乎失败并且所有克隆都被意外删除。这里不是包含整个脚本,而是重要的部分。

首先,当创建克隆时,我使用以下代码..

$vmdatestamp = (Get-Date).tostring('yyyyMMdd-HHmmss')
new-vm -Name $VM-$vmdatestamp -VM $VM -Datastore $CPFlag -vmhost host.domain.local -Location 'Regular Clone'

如果日期是 2020 年 2 月 14 日并且变量在凌晨 4 点 00 分 22 秒捕获,则此变量最终会创建一个名为 "VMName-20200214-040022" 的 VM 克隆。

随后在脚本中有一个清理部分列出了这些克隆的 VM 并检查了日期。如果克隆超过 3 天,objective 是 运行 删除命令。因此,在特定文件夹 "Regular Clone" 中找到的所有 VM 中有一个 foreach 循环 运行s。 $vmls 是找到的每个 VM 的循环内的 var。这是我用来检查日期并删除超过 3 天的代码。

#Grab matched string and doctor it to only look at 8 digit date.
$var1 = $vmls.name
$var2 = $var1 -split '-' | Select-String '\d{8}'
$var3 = $var2 -replace '(?S)'

#Grab todays date in the same 8 digit format then subtract to compare variance.  How old is the clone?
$CompareDate = (Get-Date).tostring('yyyyMMdd')
$var4 = $CompareDate - $var3

      #If clone is older than 3 days, delete it.  Turn this knob based on your requirements.
      if($var4 -gt '3') {

最后一个检查 $var4 是否大于 3 的 "if" 语句是我问题的根源所在。我认为该脚本不够聪明,无法弄清楚例如今天是否是 1 号,负号“-”是如何工作的。有人对如何更好地处理这个问题有什么建议吗?

此致, 亚当·泰勒

Powershell 在使用 [datetime] 类型处理日期和时间方面具有很大的灵活性。可能在某个地方有另一个答案,我稍后会搜索它,但这里有一些基础知识。

当你读入你的文件名时,我假设它是 'VMName-yyyyMMdd-HHmmss' 格式,你可以把它变成一个 PowerShell [datetime] 对象,就像这样(感谢 的信息[datetime]::parseexact):

[string]$VMFileName = #load $VMFileName variable with the name of your VM file somehow
$VMFNSplit = $VMFileName -split '-'
$FileDateStamp = [datetime]::ParseExact("$($VMFNSplit[-2])-$($VMFNSplit[-1])",'yyyyMMdd-HHmmss',$null)

编辑: 测试了上面的内容,得到了这个:

PS> $VMFileName = 'VMName-20200222-043322'
PS> $VMFNSplit = $VMFileName -split '-'

PS> $VMFNSplit[-2]
20200222

PS> $VMFNSplit[-1]
043322

PS> "$($VMFNSplit[-2])-$($VMFNSplit[-1])"
20200222-043322

PS> $FileDateStamp = [datetime]::ParseExact("$($VMFNSplit[-2])-$($VMFNSplit[-1])",'yyyyMMdd-HHmmss',$null)

PS> $FileDateStamp
Saturday, February 22, 2020 4:33:22 AM

一旦你的文件 date/time 在 [datetime] 中标记,你可以使用内置方法 add/subtract 你的间隔,像这样:

#If clone is older than 3 days, delete it.  Turn this knob based on your requirements.
$TooOld = (Get-Date).AddDays(-3)
If ($FileDateStamp -lt $TooOld) {#Delete it}

希望对您有所帮助!