在PowerShell中处理日期时间

在PowerShell中处理日期时间,powershell,powercli,Powershell,Powercli,我编写了一个非常漂亮的PowerShell脚本,它与VMware PowerCLI配合使用,将两个虚拟机克隆到第二个存储设备上,然后在它们达到某个年龄时自动删除它们。在月底/月初之前,它似乎工作得很好,然后我用于日期时间的方法似乎失败了,所有克隆都意外删除。以下是重要的部分,而不是包括整个脚本 首先,创建克隆时,我使用以下代码 $vmdatestamp = (Get-Date).tostring('yyyyMMdd-HHmmss') new-vm -Name $VM-$vmdatestamp -

我编写了一个非常漂亮的PowerShell脚本,它与VMware PowerCLI配合使用,将两个虚拟机克隆到第二个存储设备上,然后在它们达到某个年龄时自动删除它们。在月底/月初之前,它似乎工作得很好,然后我用于日期时间的方法似乎失败了,所有克隆都意外删除。以下是重要的部分,而不是包括整个脚本

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

$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天时运行删除命令。因此,有一个foreach循环,它运行在特定文件夹“常规克隆”中找到的所有虚拟机上$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”语句就是问题的根源所在。我认为这个脚本不够聪明,无法判断今天是不是第一天,负“-”是如何工作的。有人对如何更好地处理这个问题有什么建议吗

问候,,
Adam Tyler在使用[datetime]类型处理日期和时间方面有很大的灵活性。可能还有另一个答案,我会在后面搜索,但这里有一些基本知识

当您读入文件名时(我假设文件名为“VMName yyymmdd HHmmss”格式),您可以将其转换为类似的PowerShell[datetime]对象(感谢提供有关
[datetime]::parseexact
)的信息):

编辑: 测试了上述内容,得到了以下结果:

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
一旦在[datetime]中有了文件日期/时间戳,就可以使用内置的方法来添加/减去间隔,如下所示:

#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}

希望这有帮助

不能从另一个字符串中减去一个字符串。将它们转换为[int]:
$var4=([int]$CompareDate)-([int]$var3)
然后将
$var4
比较为3,而不是
'3'
。这很快。谢谢是的,摆脱我的约会,我相信这是关键。我会试一试并让您知道。$FileDateStamp=[datetime]::parseexact($($VMFileName[-2])-$($VMFileName[-1]),'yyyyMMdd-HHmmss',$null)调用带有“3”参数的“parseexact”异常:“字符串未被识别为有效的日期时间。”在第1行char:63+。。。[datetime]::parseexact($($VMFileName[-2])-$($VMFileName[-1]),'yyyy…+~~~~~~~~~~~~~~~~~~~~~~~~~+CategoryInfo:NotSpecified:(:)[],MethodInvocationException+FullyQualifiedErrorId:FormatException请参见上面的编辑以进行语法修复和测试。
#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}