143 lines
5.7 KiB
PowerShell
143 lines
5.7 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
A short one-line action-based description, e.g. 'Tests if a function is valid'
|
|
.DESCRIPTION
|
|
A longer description of the function, its purpose, common use cases, etc.
|
|
.NOTES
|
|
Information or caveats about the function e.g. 'This function is not supported in Linux'
|
|
.LINK
|
|
Specify a URI to a help page, this will show when Get-Help -Online is used.
|
|
.EXAMPLE
|
|
Test-MyTestFunction -Verbose
|
|
Explanation of the function or its result. You can include multiple examples with additional .EXAMPLE lines
|
|
#>
|
|
|
|
function New-ITDVMwareVMSnapshotTaskV3 {
|
|
[CmdletBinding()]
|
|
param (
|
|
[Parameter(Mandatory = $true)]
|
|
[string[]]
|
|
$VMName,
|
|
|
|
[Parameter(Mandatory = $true)]
|
|
[string]
|
|
$Name,
|
|
|
|
[string]
|
|
$Description,
|
|
|
|
[datetime]
|
|
$DateTime,
|
|
|
|
[string[]]
|
|
$Email
|
|
)
|
|
|
|
begin {
|
|
|
|
}
|
|
|
|
process {
|
|
Write-Verbose -Message "Start Loop"
|
|
ForEach ($VName in $VMName) {
|
|
Write-Verbose -Message "Start $VMName"
|
|
$VM = $null
|
|
|
|
|
|
$VM = Get-VM -Name $VMName | Where-Object { $_.ExtensionData.summary.config.ManagedBy.Type -ne "placeholderVm" } -ErrorAction SilentlyContinue
|
|
If ($VM) {
|
|
$ViServer = $VM.Uid.split('@')[1].split(':')[0]
|
|
|
|
$NewSnapshotParams = @{
|
|
Name = $Name;
|
|
RunAsync = $true;
|
|
}
|
|
switch ($PSBoundParameters.Keys) {
|
|
Description {
|
|
$NewSnapshotParams.Description = $Description
|
|
}
|
|
Memory {
|
|
$NewSnapshotParams.Memory = $Memory;
|
|
$NewSnapshotParams.RunAsync = $false;
|
|
}
|
|
}
|
|
|
|
Write-Verbose -Message ("Validate DateTime is in the future")
|
|
|
|
If ($DateTime -lt (Get-Date)) {
|
|
Write-Warning -Message "DateTime is in the past, recursively running the function again, adjusting start time to 60 seconds from now."
|
|
$NewITDVMwareVMSnapshotTaskParams = @{
|
|
VMName = $VMName;
|
|
Name = $Name;
|
|
Description = $Description;
|
|
DateTime = (Get-Date).AddSeconds(60);
|
|
Email = ($Email -join ',');
|
|
}
|
|
New-ITDVMwareVMSnapshotTaskV3 @NewITDVMwareVMSnapshotTaskParams
|
|
}
|
|
else {
|
|
Write-Verbose -Message ("Attempt sched task creation")
|
|
try {
|
|
$si = Get-View ServiceInstance -Server $VIServer
|
|
$scheduledTaskManager = Get-View $si.Content.ScheduledTaskManager -Server $VIServer
|
|
|
|
$spec = New-Object VMware.Vim.ScheduledTaskSpec
|
|
$spec.Name = $Name, $VName -join '_'
|
|
$spec.Description = "$Description"
|
|
$spec.Enabled = $true
|
|
switch ($PSBoundParameters.Keys) {
|
|
Email {
|
|
$spec.Notification = $Email
|
|
}
|
|
}
|
|
|
|
$spec.Scheduler = New-Object VMware.Vim.OnceTaskScheduler
|
|
$spec.Scheduler.runat = $DateTime
|
|
|
|
$spec.Action = New-Object VMware.Vim.MethodAction
|
|
$spec.Action.Name = "CreateSnapshot_Task"
|
|
|
|
$Memory = $false
|
|
$Quiesce = $false
|
|
|
|
@($Name, $Description, $Memory, $Quiesce) | ForEach-Object {
|
|
$arg = New-Object VMware.Vim.MethodActionArgument
|
|
$arg.Value = $_
|
|
$spec.Action.Argument += $arg
|
|
}
|
|
Start-Sleep -Seconds 20
|
|
|
|
try {
|
|
$scheduledTaskManager.CreateObjectScheduledTask($vm.ExtensionData.MoRef, $spec)
|
|
}
|
|
catch [System.Management.Automation.MethodInvocationException] {
|
|
Write-Warning -Message "System.Management.Automation.MethodInvocationException"
|
|
If ($error[0].Exception.Message -like "*You have attempted to schedule the scheduler at a time value*" -and $error[0].Exception.Message -Like "* in the past,*") {
|
|
Write-Warning -Message "DateTime is in the past, recursively running the function again, adjusting start time to 60 seconds in the future from now."
|
|
$NewITDVMwareVMSnapshotTaskParams = @{
|
|
VMName = $VMName;
|
|
Name = $Name;
|
|
Description = $Description;
|
|
DateTime = (Get-Date).AddSeconds(60);
|
|
Email = $Email;
|
|
}
|
|
New-ITDVMwareVMSnapshotTaskV3 @NewITDVMwareVMSnapshotTaskParams
|
|
}
|
|
}
|
|
catch {
|
|
Write-Warning -Message "Default"
|
|
}
|
|
|
|
}
|
|
catch {
|
|
Write-Error $error[0]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
end {
|
|
|
|
}
|
|
} |