Разобраться с датой и временем в PowerShell - PullRequest
0 голосов
/ 14 февраля 2020

Я написал довольно изящный скрипт 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'

Эта переменная в конечном итоге создает Клон виртуальной машины с именем «VMName-20200214-040022» в том случае, если датой является 14 февраля 2020 года, а переменная записана в 4 часа утра, 00 минут и 22 секунды.

Затем в сценарии. есть раздел очистки, который перечисляет эти клонированные виртуальные машины и проверяет дату. Задача - запустить команду удаления, если клон старше 3 дней. Таким образом, существует foreach l oop, который запускает все виртуальные машины, найденные в определенной папке, «Regular Clone». $ vmls - это переменная в пределах l oop для каждой найденной виртуальной машины. Вот код, который я использую, чтобы проверить даты и удалить старше 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, где источник моей проблемы , Я не думаю, что сценарий достаточно умен, чтобы понять, если, например, сегодня 1-й, как работает минус «-». У кого-нибудь есть предложения, как лучше с этим справиться?

С уважением, Адам Тайлер

1 Ответ

0 голосов
/ 14 февраля 2020

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

Когда у вас есть отметка даты / времени в вашем файле в [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}

Надеюсь, это поможет!

...