<#
.SYNOPSIS
    VMs aus VMware suchen, deren Notes/Hinweise ein bestimmtes Datum enthalten.

.DESCRIPTION
    Fragt alle virtuellen Maschinen aus VMware ab und filtert nach VMs,
    deren Notes-Feld ein bestimmtes Datum enthaelt (z.B. *29.07.26*).
    Das Suchmuster unterstuetzt Wildcards (* und ?).

.PARAMETER VIServer
    Adresse des vCenter Servers (z.B. vcenter.firma.de)

.PARAMETER SearchPattern
    Das Suchmuster fuer die Notes mit Wildcards.
    Standard: *29.07.26* (Tag.Monat.Jahr im 2-stelligen Format)
    Beispiele:
        "*29.07.26*"   - Alle VMs mit "29.07.26" irgendwo in den Notes
        "*07.26*"      - Alle VMs mit "07.26" (Monat.Jahr)
        "*2026*"       - Alle VMs mit "2026" in den Notes

.PARAMETER DateFormat
    Optionales Datumsformat-Muster (Regex). Wenn gesetzt, werden alle VMs
    gefunden die irgendein Datum im Format TT.MM.JJ in den Notes haben.

.EXAMPLE
    .\Get-VMByDateInNotes.ps1 -VIServer vcenter.firma.de -SearchPattern "*29.07.26*"

.EXAMPLE
    .\Get-VMByDateInNotes.ps1 -VIServer vcenter.firma.de -SearchPattern "*31.12.25*"

.EXAMPLE
    # Alle VMs mit irgendeinem Datum im Format TT.MM.JJ:
    .\Get-VMByDateInNotes.ps1 -VIServer vcenter.firma.de -DateFormat "\d{2}\.\d{2}\.\d{2}"
#>

[CmdletBinding(DefaultParameterSetName = "Wildcard")]
param(
    [Parameter(Mandatory = $true)]
    [string]$VIServer,

    [Parameter(ParameterSetName = "Wildcard")]
    [string]$SearchPattern = "*29.07.26*",

    [Parameter(ParameterSetName = "Regex")]
    [string]$DateFormat = ""
)

# PowerCLI-Modul laden
if (-not (Get-Module -Name VMware.PowerCLI -ListAvailable)) {
    Write-Error "VMware.PowerCLI ist nicht installiert. Bitte installieren via: Install-Module -Name VMware.PowerCLI -Scope CurrentUser"
    exit 1
}

Import-Module VMware.PowerCLI -ErrorAction Stop

# Verbindung zum vCenter herstellen
Write-Host "Verbinde mit vCenter: $VIServer ..." -ForegroundColor Cyan
try {
    $null = Connect-VIServer -Server $VIServer -ErrorAction Stop
    Write-Host "Verbindung erfolgreich." -ForegroundColor Green
}
catch {
    Write-Error "Verbindung zum vCenter fehlgeschlagen: $_"
    exit 1
}

# Alle VMs abrufen
Write-Host "Abfragen aller VMs ..." -ForegroundColor Cyan
$vms = Get-VM

$results = @()

if ($PSCmdlet.ParameterSetName -eq "Wildcard" -and -not $DateFormat) {
    # Wildcard-Suche (Standard)
    Write-Host "Suche in VM-Notes nach Muster: $SearchPattern" -ForegroundColor Yellow

    foreach ($vm in $vms) {
        $notes = $vm.Notes
        if ($notes -and $notes -like $SearchPattern) {
            $results += [PSCustomObject]@{
                VMName      = $vm.Name
                Notes       = $notes
                State       = $vm.PowerState
                Cluster     = (Get-Cluster -VM $vm -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Name -ErrorAction SilentlyContinue)
                Host        = ($vm.VMHost.Name)
            }
        }
    }
}
else {
    # Regex-Suche - alle VMs mit irgendeinem Datum im Format finden
    if (-not $DateFormat) {
        $DateFormat = '\d{2}\.\d{2}\.\d{2}'
    }
    Write-Host "Suche in VM-Notes nach Regex-Muster: $DateFormat" -ForegroundColor Yellow

    foreach ($vm in $vms) {
        $notes = $vm.Notes
        if ($notes -and $notes -match $DateFormat) {
            $results += [PSCustomObject]@{
                VMName      = $vm.Name
                Notes       = $notes
                State       = $vm.PowerState
                Cluster     = (Get-Cluster -VM $vm -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Name -ErrorAction SilentlyContinue)
                Host        = ($vm.VMHost.Name)
            }
        }
    }
}

# Ergebnisse anzeigen
Write-Host ""
if ($results.Count -eq 0) {
    Write-Host "Keine VMs mit dem Suchmuster '$SearchPattern' in den Notes gefunden." -ForegroundColor Red
}
else {
    Write-Host "Gefundene VMs: $($results.Count)" -ForegroundColor Green
    Write-Host ("=" * 80)
    $results | Format-Table -AutoSize -Wrap
}

# Verbindung trennen
Disconnect-VIServer -Server $VIServer -Confirm:$false
Write-Host "Verbindung getrennt. Fertig." -ForegroundColor Cyan
