<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>http://vwiki.co.uk/index.php?action=history&amp;feed=atom&amp;title=VI-DB_db-esx-check-v6.ps1</id>
	<title>VI-DB db-esx-check-v6.ps1 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://vwiki.co.uk/index.php?action=history&amp;feed=atom&amp;title=VI-DB_db-esx-check-v6.ps1"/>
	<link rel="alternate" type="text/html" href="http://vwiki.co.uk/index.php?title=VI-DB_db-esx-check-v6.ps1&amp;action=history"/>
	<updated>2026-04-19T05:34:54Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://vwiki.co.uk/index.php?title=VI-DB_db-esx-check-v6.ps1&amp;diff=1447&amp;oldid=prev</id>
		<title>Sstrutt: Initial creation</title>
		<link rel="alternate" type="text/html" href="http://vwiki.co.uk/index.php?title=VI-DB_db-esx-check-v6.ps1&amp;diff=1447&amp;oldid=prev"/>
		<updated>2011-10-12T08:52:35Z</updated>

		<summary type="html">&lt;p&gt;Initial creation&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
# ==========================================================&lt;br /&gt;
# ESX Status updater&lt;br /&gt;
# ==========================================================&lt;br /&gt;
# Simon Strutt        Feb 2011&lt;br /&gt;
# ==========================================================&lt;br /&gt;
#&lt;br /&gt;
# Version 1 &lt;br /&gt;
# - Initial creation&lt;br /&gt;
#&lt;br /&gt;
# Version 2 - Feb 2011&lt;br /&gt;
# - Script now manages intra-day checks, expects to started each AM&lt;br /&gt;
# - Added log rollover&lt;br /&gt;
#&lt;br /&gt;
# Version 3 - Feb 2011&lt;br /&gt;
# - Allow for ESX state data move to esx_state db table&lt;br /&gt;
# - Add % used to data collection&lt;br /&gt;
# - Add $DoSingleRun to bypass scheduling&lt;br /&gt;
#&lt;br /&gt;
# Version 4 - Mar 2011&lt;br /&gt;
# - Improved ESX search string&lt;br /&gt;
# - Handle ESX being removed from vCentre&lt;br /&gt;
#&lt;br /&gt;
# Version 5 - Apr 2011&lt;br /&gt;
# - Update ESX cluster membership&lt;br /&gt;
#&lt;br /&gt;
# Version 6 - Sep 2011&lt;br /&gt;
# - Bugfix: Log rollover didn&amp;#039;t work&lt;br /&gt;
# - Performance optimisation - changed data gather to use single Get-View&lt;br /&gt;
#&lt;br /&gt;
# ==========================================================&lt;br /&gt;
&lt;br /&gt;
$Debug = 0&lt;br /&gt;
&lt;br /&gt;
$start = Get-Date&lt;br /&gt;
$UserFile = &amp;quot;User.fil&amp;quot;&lt;br /&gt;
$PassFile = &amp;quot;Pass.fil&amp;quot;                           # Encrypted file to store password in&lt;br /&gt;
&lt;br /&gt;
# DB connection stuff...&lt;br /&gt;
$user = &amp;#039;powercli&amp;#039; &lt;br /&gt;
$pass = &amp;#039;powercli&amp;#039; &lt;br /&gt;
$database = &amp;#039;vi&amp;#039; &lt;br /&gt;
$MySQLHost = &amp;#039;192.168.196.128&amp;#039; &lt;br /&gt;
&lt;br /&gt;
$LogNonQueries = 0&lt;br /&gt;
$LogStamp = &amp;quot;Time&amp;quot;&lt;br /&gt;
&lt;br /&gt;
# Scheduler stuff...&lt;br /&gt;
$DoSingleRun = 0            # Ignore scheduling and just run once&lt;br /&gt;
$IntervalMins = 5           # Should fit into an hour exactly&lt;br /&gt;
$End = &amp;quot;18:50&amp;quot;              # Time of day that script should cease (should be just after last required run time)&lt;br /&gt;
$CheckThrottle = 250        # Idle throttle / time check interval (msec)&lt;br /&gt;
&lt;br /&gt;
if ($Debug) {&lt;br /&gt;
    $database = &amp;#039;vi_test&amp;#039;&lt;br /&gt;
    $LogNonQueries = 1&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Include library files&lt;br /&gt;
. .\lib\Standard-v4.ps1&lt;br /&gt;
&lt;br /&gt;
# MySQL functions ===============================================================================&lt;br /&gt;
&lt;br /&gt;
function ConnectMySQL([string]$user, [string]$pass, [string]$MySQLHost, [string]$database) { &lt;br /&gt;
    # Load MySQL .NET Connector Objects &lt;br /&gt;
    [void][system.reflection.Assembly]::LoadWithPartialName(&amp;quot;MySql.Data&amp;quot;) &lt;br /&gt;
 &lt;br /&gt;
    # Open Connection &lt;br /&gt;
    $connStr = &amp;quot;server=&amp;quot; + $MySQLHost + &amp;quot;;port=3306;uid=&amp;quot; + $user + &amp;quot;;pwd=&amp;quot; + $pass + &amp;quot;;database=&amp;quot;+$database+&amp;quot;;Pooling=FALSE&amp;quot; &lt;br /&gt;
    try {&lt;br /&gt;
        $conn = New-Object MySql.Data.MySqlClient.MySqlConnection($connStr) &lt;br /&gt;
        $conn.Open()&lt;br /&gt;
    } catch [System.Management.Automation.PSArgumentException] {&lt;br /&gt;
        Log &amp;quot;Unable to connect to MySQL server, do you have the MySQL connector installed..?&amp;quot;&lt;br /&gt;
        Log $_&lt;br /&gt;
        Exit&lt;br /&gt;
    } catch {&lt;br /&gt;
        Log &amp;quot;Unable to connect to MySQL server...&amp;quot;&lt;br /&gt;
        Log $_.Exception.GetType().FullName&lt;br /&gt;
        Log $_.Exception.Message&lt;br /&gt;
        exit&lt;br /&gt;
    }&lt;br /&gt;
    Log (&amp;quot;Connected to MySQL database &amp;quot; + $conn.Database + &amp;quot; on &amp;quot; + $conn.DataSource + &amp;quot; (ver &amp;quot; + $conn.ServerVersion + &amp;quot;)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    return $conn &lt;br /&gt;
} &lt;br /&gt;
&lt;br /&gt;
function DisconnectMySQL {&lt;br /&gt;
    $SQLconn.Close()&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function ExecuteMySQLNonQuery([string]$query) { &lt;br /&gt;
    # NonQuery - Insert/Update/Delete query where no return data is required&lt;br /&gt;
    &lt;br /&gt;
    if ($LogNonQueries) {&lt;br /&gt;
        Log ($query)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    try {&lt;br /&gt;
        $cmd = $SQLconn.CreateCommand()               # Create command object&lt;br /&gt;
        $cmd.CommandText = $query                     # Load query into object&lt;br /&gt;
        $RowsInserted = $cmd.ExecuteNonQuery()        # Execute command&lt;br /&gt;
        $cmd.Dispose()                                # Dispose of command object&lt;br /&gt;
        if ($RowsInserted) { &lt;br /&gt;
            return $RowInserted &lt;br /&gt;
        } else { &lt;br /&gt;
            return $false &lt;br /&gt;
        }&lt;br /&gt;
    } catch {&lt;br /&gt;
        Log (&amp;quot;ExecuteMySQLNonQuery($query) error...&amp;quot;)&lt;br /&gt;
        Log $_.Exception.GetType().FullName&lt;br /&gt;
        Log $_.Exception.Message&lt;br /&gt;
        Exit&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function ExecuteMySQLQuery([string]$query) { &lt;br /&gt;
    # Query - Select etc query where return data is expected&lt;br /&gt;
    try {&lt;br /&gt;
        $cmd = $SQLconn.CreateCommand()                                             # Create command object&lt;br /&gt;
        $cmd.CommandText = $query                                                   # Load query into object&lt;br /&gt;
        $dataAdapter = New-Object MySql.Data.MySqlClient.MySqlDataAdapter($cmd)     # Create data adapter from query command&lt;br /&gt;
        $dataSet = New-Object System.Data.DataSet                                   # Create dataset&lt;br /&gt;
        $dataAdapter.Fill($dataSet, &amp;quot;data&amp;quot;)                                         # Fill dataset from data adapter, with name &amp;quot;data&amp;quot;              &lt;br /&gt;
        $cmd.Dispose()&lt;br /&gt;
        $dataAdapter.Dispose()&lt;br /&gt;
        return $dataSet.Tables[&amp;quot;data&amp;quot;]                                              # Returns an array of results&lt;br /&gt;
    } catch {&lt;br /&gt;
        Log (&amp;quot;ExecuteMySQLQuery($query) error...&amp;quot;)&lt;br /&gt;
        Log $_.Exception.GetType().FullName&lt;br /&gt;
        Log $_.Exception.Message&lt;br /&gt;
        Exit&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function ExecuteMySQLScalar([string]$query) {&lt;br /&gt;
    # Scalar - Select etc query where a single value of return data is expected&lt;br /&gt;
    try {&lt;br /&gt;
        $cmd = $SQLconn.CreateCommand()                                             # Create command object&lt;br /&gt;
        $cmd.CommandText = $query                                                   # Load query into object&lt;br /&gt;
        $cmd.ExecuteScalar()                                                        # Execute command&lt;br /&gt;
    } catch {&lt;br /&gt;
        Log (&amp;quot;ExecuteMySQLScalar($query) error...&amp;quot;)&lt;br /&gt;
        Log $_.Exception.GetType().FullName&lt;br /&gt;
        Log $_.Exception.Message&lt;br /&gt;
        Exit&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Check function =================================================================================&lt;br /&gt;
&lt;br /&gt;
function Perform-ESX-Check {&lt;br /&gt;
    # Disconnect any existing VI Server sessions&lt;br /&gt;
    if ($DefaultVIServers.Count) {&lt;br /&gt;
        Log(&amp;quot;Disconnect existing vCentre server connections...&amp;quot;)&lt;br /&gt;
        Disconnect-VIServer -Server * -Force -Confirm:$false&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    # Get list of clusters in order to be able to update ESX cluster membership on the fly&lt;br /&gt;
    $dbClusters = ExecuteMySQLQuery(&amp;quot;SELECT vcid, clid, name FROM cluster WHERE exist=1;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    foreach ($vc in $VCs) {&lt;br /&gt;
        # Check its a valid record 1st&lt;br /&gt;
        if (!$vc.vcid) {&lt;br /&gt;
            Continue&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        # Connect to vCentre&lt;br /&gt;
        try {&lt;br /&gt;
            Log(&amp;quot;Checking &amp;quot; + $vc.name)&lt;br /&gt;
            $VCconn = Connect-VIServer -Server $vc.name -Credential $cred -WarningAction SilentlyContinue -ErrorAction &amp;quot;Stop&amp;quot;&lt;br /&gt;
        } catch [VMware.VimAutomation.ViCore.Types.V1.ErrorHandling.InvalidLogin] {&lt;br /&gt;
            Log(&amp;quot;Unable to connect to vCentre, invalid logon error !!&amp;quot;)&lt;br /&gt;
            Log(&amp;quot;Abandoning further script processing in order to prevent potential account lockout.&amp;quot;)&lt;br /&gt;
            $Major_Error = 99&lt;br /&gt;
            Break&lt;br /&gt;
        } catch {&lt;br /&gt;
            Log(&amp;quot;Unable to connect to vCentre - &amp;quot; + $_)&lt;br /&gt;
            $Major_Error += 1&lt;br /&gt;
            Continue&lt;br /&gt;
        }&lt;br /&gt;
        if ($Debug) {Log &amp;quot;Connected to vCenter&amp;quot;}&lt;br /&gt;
        &lt;br /&gt;
        $dbESXs = ExecuteMySQLQuery(&amp;quot;SELECT esxid, clid, name FROM esx WHERE vcid = &amp;quot; + $vc.vcid + &amp;quot; AND exist=1;&amp;quot;)&lt;br /&gt;
        $vcESXs = Get-View -ViewType HostSystem -Property Name, Parent, Runtime.ConnectionState, Summary.Runtime.InMaintenanceMode, OverallStatus, Summary.Hardware.CpuMhz, Summary.Hardware.NumCpuCores, Summary.Hardware.MemorySize, Summary.QuickStats.OverallCpuUsage, Summary.QuickStats.OverallMemoryUsage&lt;br /&gt;
        if ($Debug) {Log (&amp;quot;Got ESX View data&amp;quot;)}&lt;br /&gt;
        $vcClusters = Get-View -ViewType ClusterComputeResource -Property Name&lt;br /&gt;
        if ($Debug) {Log (&amp;quot;Got Cluster View data, processsing...&amp;quot;)}&lt;br /&gt;
        &lt;br /&gt;
        #$dbESXs.gettype()&lt;br /&gt;
        #$dbESXs&lt;br /&gt;
        #$dbESXs[1].esxid.gettype()&lt;br /&gt;
        &lt;br /&gt;
        foreach ($esx in $vcESXs) {&lt;br /&gt;
            &lt;br /&gt;
            # Match to ESX db record&lt;br /&gt;
            $esxName = [regex]::matches($esx.Name, &amp;quot;(^\b((25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)\.){3}(25[0-5]|2[0-4]\d|[01]\d\d|\d?\d)\b)|(\A(\w|-)+)&amp;quot;)&lt;br /&gt;
            $dbESX = $dbESXs |?{$_.name -match $esxName} #| Select -ExpandProperty esxid, clid&lt;br /&gt;
            &lt;br /&gt;
            # Get cluster name, and then db ID&lt;br /&gt;
            $cluster = $vcClusters |?{$_.Moref -eq $esx.Parent} | Select -ExpandProperty Name&lt;br /&gt;
            $clid = $dbClusters |?{$_.name -eq $cluster} | Select -ExpandProperty clid&lt;br /&gt;
            if (!$clid) {&lt;br /&gt;
                $clid = &amp;quot;NULL&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            # Update ESX&amp;#039;s clid if its changed&lt;br /&gt;
            if ($clid -ne $dbESX.clid) {&lt;br /&gt;
                ExecuteMySQLNonQuery(&amp;quot;UPDATE esx SET clid=$clid WHERE esxid=&amp;quot; + $dbESX.esxid + &amp;quot;;&amp;quot;)&lt;br /&gt;
                Log($esx.name + &amp;quot; changed cluster ID &amp;quot; + $dbESX.clid + &amp;quot; --&amp;gt; $clid&amp;quot;)&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            # Update ESX state&lt;br /&gt;
            # Could add http://www.vmware.com/support/developer/vc-sdk/visdk400pubs/ReferenceGuide/vim.HostSystem.PowerState.html in later version&lt;br /&gt;
            if ($esx.Runtime.ConnectionState -eq &amp;quot;connected&amp;quot;) {&lt;br /&gt;
                if ($esx.Summary.Runtime.InMaintenanceMode) {&lt;br /&gt;
                    $state = &amp;quot;Maintenance&amp;quot;&lt;br /&gt;
                } else {&lt;br /&gt;
                    $state = &amp;quot;Connected&amp;quot;&lt;br /&gt;
                }&lt;br /&gt;
            } elseif ($esx.Runtime.ConnectionState -eq &amp;quot;disconnected&amp;quot;) {&lt;br /&gt;
                $state = &amp;quot;Disconnected&amp;quot;&lt;br /&gt;
            } elseif ($esx.Runtime.ConnectionState -eq &amp;quot;notResponding&amp;quot;) {&lt;br /&gt;
                $state = &amp;quot;NotResponding&amp;quot;&lt;br /&gt;
            } else {&lt;br /&gt;
                $state = $esx.Runtime.ConnectionState&lt;br /&gt;
                Log (&amp;quot;Unexpected ESX state &amp;quot; + $esx.name + &amp;quot;: &amp;quot; + $esx.Runtime.ConnectionState)&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            $query = &amp;quot;UPDATE esx_state SET state=&amp;#039;&amp;quot; + $state + &amp;quot;&amp;#039;, status=&amp;#039;&amp;quot; + $esx.OverallStatus + &amp;quot;&amp;#039;, &amp;quot;&lt;br /&gt;
            $query += &amp;quot;cpu_pc=&amp;quot; + [Math]::Round(($esx.Summary.QuickStats.OverallCpuUsage / ($esx.Summary.Hardware.CpuMhz * $esx.Summary.Hardware.NumCpuCores) * 100)) + &amp;quot;, &amp;quot;&lt;br /&gt;
            $query += &amp;quot;mem_pc=&amp;quot; + [Math]::Round(($esx.Summary.QuickStats.OverallMemoryUsage / ($esx.Summary.Hardware.MemorySize/1048576) * 100)) + &amp;quot; WHERE esxid=&amp;quot; + $dbESX.esxid + &amp;quot;;&amp;quot;&lt;br /&gt;
            ExecuteMySQLNonQuery($query)&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        # Check for ESX&amp;#039;s that have disappeared from VC&lt;br /&gt;
        foreach ($dbESX in $dbESXs) {&lt;br /&gt;
            $exists = $vcESXs |?{$_.name -match $dbESX.name} #| Select -ExpandProperty Summary.Hardware.NumCpuCores&lt;br /&gt;
            if (!$exists) {&lt;br /&gt;
                $query = &amp;quot;UPDATE esx_state SET state=&amp;#039;Gone&amp;#039; WHERE esxid=&amp;quot; + $dbESX.esxid + &amp;quot;;&amp;quot;&lt;br /&gt;
                ExecuteMySQLNonQuery($query)&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        ExecuteMySQLNonQuery(&amp;quot;UPDATE vc SET last_esx_check=NOW() WHERE vcid=&amp;quot; + $vc.vcid + &amp;quot;;&amp;quot;)&lt;br /&gt;
               &lt;br /&gt;
        Disconnect-VIServer -Server $VCconn -Confirm:$false&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Log-Perf {&lt;br /&gt;
    Log (&amp;quot;Perf CPU(sec): &amp;quot; + [Math]::Round($proc.cpu, 0) + &amp;quot;, Paged Mem (MB): &amp;quot; + [Math]::Round(($proc.pm/1024), 0) + &amp;quot;, WrkSet Mem (MB): &amp;quot; + [Math]::Round(($proc.ws/1024), 0))&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# MAIN SCRIPT ====================================================================================&lt;br /&gt;
&lt;br /&gt;
# Initial prep -----------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
if ($DoSingleRun -or $Debug) {&lt;br /&gt;
    Rename-Item -Path db-base-check-test.log -NewName db-base-check-test-1.log -Force&lt;br /&gt;
    Start-Transcript -Path db-base-check-test.log -Append&lt;br /&gt;
} else {&lt;br /&gt;
    Rename-Item -Path db-base-check.log -NewName db-base-check-1.log -Force&lt;br /&gt;
    Start-Transcript -Path db-base-check.log -Append&lt;br /&gt;
}&lt;br /&gt;
Log &amp;quot;Started script run at $start&amp;quot; &lt;br /&gt;
&lt;br /&gt;
# Get process for this script&lt;br /&gt;
$proc = [System.Diagnostics.Process]::GetCurrentProcess()&lt;br /&gt;
&lt;br /&gt;
# Check scheduler variables&lt;br /&gt;
if ((60 % $IntervalMins) -ne 0) {&lt;br /&gt;
    Log &amp;quot;Interval error - $IntervalMins mins doesn&amp;#039;t fit into an hour!&amp;quot;&lt;br /&gt;
    Exit&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
try {&lt;br /&gt;
    $EndTime = Get-Date $End&lt;br /&gt;
} catch {&lt;br /&gt;
    Log &amp;quot;Invalid end time: $End hrs&amp;quot;&lt;br /&gt;
    Log $_.Exception.GetType().FullName&lt;br /&gt;
    Log $_.Exception.Message&lt;br /&gt;
    Exit&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# Set dummy last run time (aligned to nice start time), and next run time&lt;br /&gt;
$LastRunTime = Get-Date&lt;br /&gt;
$offset = ($IntervalMins + ($LastRunTime.Minute % $IntervalMins))&lt;br /&gt;
$LastRunTime = $LastRunTime.AddMinutes(-$offset)&lt;br /&gt;
$LastRunTime = $LastRunTime.AddSeconds(-$LastRunTime.Second)&lt;br /&gt;
$NextRunTime = $LastRunTime.AddMinutes($IntervalMins)&lt;br /&gt;
&lt;br /&gt;
#Write-Host &amp;quot;Offset is       &amp;quot; $offset&lt;br /&gt;
Log (&amp;quot;Last runtime is &amp;quot; + $LastRunTime)&lt;br /&gt;
Log (&amp;quot;Next runtime is &amp;quot; + $NextRunTime)&lt;br /&gt;
Log (&amp;quot;Script cease at &amp;quot; + $EndTime)&lt;br /&gt;
&lt;br /&gt;
# Connect to MySQL database&lt;br /&gt;
$SQLconn = ConnectMySQL $user $pass $MySQLHost $database&lt;br /&gt;
&lt;br /&gt;
# Get list of VC&amp;#039;s (checks the SQL connection is in good working order as well)&lt;br /&gt;
$VCs = ExecuteMySQLQuery(&amp;quot;SELECT vcid, name, site FROM vc;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
# Load password credential from encrypted file&lt;br /&gt;
$pass = Get-Content $PassFile | ConvertTo-SecureString&lt;br /&gt;
$user = Get-Content $UserFile&lt;br /&gt;
$cred = New-Object System.Management.Automation.PsCredential($user, $pass)&lt;br /&gt;
&lt;br /&gt;
# Main loop -------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
if ($DoSingleRun) {&lt;br /&gt;
    Log (&amp;quot;Doing single run...&amp;quot;)&lt;br /&gt;
    Perform-ESX-Check&lt;br /&gt;
} else {&lt;br /&gt;
    While (1) {&lt;br /&gt;
        if ($NextRunTime -lt (Get-Date)) {&lt;br /&gt;
            Log-Perf&lt;br /&gt;
            Log (&amp;quot;Starting check run&amp;quot;)&lt;br /&gt;
            Perform-ESX-Check&lt;br /&gt;
            Log (&amp;quot;Completed check run&amp;quot;)&lt;br /&gt;
            $LastRunTime = $LastRunTime.AddMinutes($IntervalMins)&lt;br /&gt;
            $NextRunTime = $LastRunTime.AddMinutes($IntervalMins)&lt;br /&gt;
            if ($NextRunTime -lt (Get-Date)) {&lt;br /&gt;
                Log &amp;quot;WARNING: Next run is going to be late!&amp;quot;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if ($EndTime -lt (Get-Date)) {&lt;br /&gt;
            Log (&amp;quot;Script ending at &amp;quot; + (Get-Date))&lt;br /&gt;
            Break&lt;br /&gt;
        }&lt;br /&gt;
        Start-Sleep -Milliseconds $CheckThrottle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
DisconnectMySQL&lt;br /&gt;
Stop-Transcript&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Sstrutt</name></author>
	</entry>
</feed>