pixel0815
Goto Top

PS Skript als String Speichern

Moin,

ich möchte diese Funktion als String / Text in einer Variable speichern.
Leider stecke ich grade echt fest. Das klappt einfach nicht.

Funktion

function Invoke-LocalCCMActions {
    param (
        [string]$Actions               # Optional: Kommagetrennte Liste von Action-Nummern oder Namen
    )

    # Dictionary mit den verfügbaren CCM-Actions
    $ActionMap = @{
        "HardwareInventory"             = "{00000000-0000-0000-0000-000000000001}"  
        "SoftwareInventory"             = "{00000000-0000-0000-0000-000000000002}"  
        "MachinePolicyRequest"          = "{00000000-0000-0000-0000-000000000021}"  
        "UserPolicyRequest"             = "{00000000-0000-0000-0000-000000000022}"  
        "SoftwareUpdatesScan"           = "{00000000-0000-0000-0000-000000000113}"  
        "SoftwareUpdatesDeployment"     = "{00000000-0000-0000-0000-000000000108}"  
        "DiscoveryDataCollection"       = "{00000000-0000-0000-0000-000000000003}"  
        "FileCollection"                = "{00000000-0000-0000-0000-000000000010}"  
    }

    $ActionsSorted = $ActionMap.Keys | Sort-Object
    $SelectedActions = @()

    # Falls Actions als Parameter übergeben wurden, direkt verarbeiten
    if ($Actions) {
        $InputActions = $Actions -split "," | ForEach-Object { $_.Trim() }  

        foreach ($Action in $InputActions) {
            if ($Action -match "^\d+$") {  
                # Nummer wurde eingegeben -> Index umrechnen
                $Index = [int]$Action - 1
                if ($Index -ge 0 -and $Index -lt $ActionsSorted.Count) {
                    $SelectedActions += $ActionsSorted[$Index]
                }
            } elseif ($ActionMap.ContainsKey($Action)) {
                # Action-Name direkt angegeben
                $SelectedActions += $Action
            }
        }

        # Falls keine gültigen Actions ermittelt wurden, Eingabe neu anfordern
        if ($SelectedActions.Count -eq 0) {
            Write-Host "❌ Ungültige Actions angegeben! Bitte erneut versuchen." -ForegroundColor Red  
            return
        }
    } else {
        # Benutzer zur Auswahl auffordern, falls keine Actions übergeben wurden
        Write-Host "`n🔵 Wählen Sie eine oder mehrere CCM-Actions aus (z.B. '1,3,5'):`n" -ForegroundColor Cyan  
        for ($i = 0; $i -lt $ActionsSorted.Count; $i++) {
            Write-Host "$($i + 1). $($ActionsSorted[$i])"  
        }

        # Eingabe des Benutzers abfragen
        $Selection = Read-Host "`nGeben Sie die Nummer(n) oder Namen der gewünschten Aktion(en) ein (z. B. '1,3,5' oder 'MachinePolicyRequest,SoftwareUpdatesScan')"  
        
        # Verarbeitung der Eingabe
        $InputActions = $Selection -split "," | ForEach-Object { $_.Trim() }  

        foreach ($Action in $InputActions) {
            if ($Action -match "^\d+$") {  
                # Nummer wurde eingegeben -> Index umrechnen
                $Index = [int]$Action - 1
                if ($Index -ge 0 -and $Index -lt $ActionsSorted.Count) {
                    $SelectedActions += $ActionsSorted[$Index]
                }
            } elseif ($ActionMap.ContainsKey($Action)) {
                # Action-Name direkt angegeben
                $SelectedActions += $Action
            }
        }

        # Falls keine gültige Auswahl getroffen wurde
        if ($SelectedActions.Count -eq 0) {
            Write-Host "❌ Ungültige Auswahl! Bitte erneut ausführen." -ForegroundColor Red  
            return
        }
    }

    # Alle ausgewählten Actions werden lokal ausgeführt
    foreach ($ActionName in $SelectedActions) {
        $ActionID = $ActionMap[$ActionName]
        Write-Host "`n🔄 Starte CCM-Aktion '$ActionName' lokal..." -ForegroundColor Cyan  
        
        try {
            # Lokale WMI-Methode für Triggern der CCM-Aktion verwenden
            Invoke-WmiMethod -Namespace "root\ccm" -Class "SMS_Client" -Name "TriggerSchedule" -ArgumentList $ActionID | Out-Null  
            Write-Host "✅ CCM-Aktion '$ActionName' erfolgreich lokal ausgeführt." -ForegroundColor Green  
        } catch {
            Write-Host "❌ Fehler beim Ausführen der CCM-Aktion '$ActionName' lokal: $_" -ForegroundColor Red  
        }
    }
}

Hätte jetzt quasi die Funktion einfach dort hineinkopiert

$ScriptContent = @"  
function Invoke-LocalCCMActions {
    param (
        [string]$Actions               # Optional: Kommagetrennte Liste von Action-Nummern oder Namen
    )

    # Dictionary mit den verfügbaren CCM-Actions
    $ActionMap = @{
        "HardwareInventory"             = "{00000000-0000-0000-0000-000000000001}"  
        "SoftwareInventory"             = "{00000000-0000-0000-0000-000000000002}"  
        "MachinePolicyRequest"          = "{00000000-0000-0000-0000-000000000021}"  
        "UserPolicyRequest"             = "{00000000-0000-0000-0000-000000000022}"  
        "SoftwareUpdatesScan"           = "{00000000-0000-0000-0000-000000000113}"  
        "SoftwareUpdatesDeployment"     = "{00000000-0000-0000-0000-000000000108}"  
        "DiscoveryDataCollection"       = "{00000000-0000-0000-0000-000000000003}"  
        "FileCollection"                = "{00000000-0000-0000-0000-000000000010}"  
    }

    $ActionsSorted = $ActionMap.Keys | Sort-Object
    $SelectedActions = @()

    # Falls Actions als Parameter übergeben wurden, direkt verarbeiten
    if ($Actions) {
        $InputActions = $Actions -split "," | ForEach-Object { $_.Trim() }  

        foreach ($Action in $InputActions) {
            if ($Action -match "^\d+$") {  
                # Nummer wurde eingegeben -> Index umrechnen
                $Index = [int]$Action - 1
                if ($Index -ge 0 -and $Index -lt $ActionsSorted.Count) {
                    $SelectedActions += $ActionsSorted[$Index]
                }
            } elseif ($ActionMap.ContainsKey($Action)) {
                # Action-Name direkt angegeben
                $SelectedActions += $Action
            }
        }

        # Falls keine gültigen Actions ermittelt wurden, Eingabe neu anfordern
        if ($SelectedActions.Count -eq 0) {
            Write-Host "❌ Ungültige Actions angegeben! Bitte erneut versuchen." -ForegroundColor Red  
            return
        }
    } else {
        # Benutzer zur Auswahl auffordern, falls keine Actions übergeben wurden
        Write-Host "`n🔵 Wählen Sie eine oder mehrere CCM-Actions aus (z.B. '1,3,5'):`n" -ForegroundColor Cyan  
        for ($i = 0; $i -lt $ActionsSorted.Count; $i++) {
            Write-Host "$($i + 1). $($ActionsSorted[$i])"  
        }

        # Eingabe des Benutzers abfragen
        $Selection = Read-Host "`nGeben Sie die Nummer(n) oder Namen der gewünschten Aktion(en) ein (z. B. '1,3,5' oder 'MachinePolicyRequest,SoftwareUpdatesScan')"  
        
        # Verarbeitung der Eingabe
        $InputActions = $Selection -split "," | ForEach-Object { $_.Trim() }  

        foreach ($Action in $InputActions) {
            if ($Action -match "^\d+$") {  
                # Nummer wurde eingegeben -> Index umrechnen
                $Index = [int]$Action - 1
                if ($Index -ge 0 -and $Index -lt $ActionsSorted.Count) {
                    $SelectedActions += $ActionsSorted[$Index]
                }
            } elseif ($ActionMap.ContainsKey($Action)) {
                # Action-Name direkt angegeben
                $SelectedActions += $Action
            }
        }

        # Falls keine gültige Auswahl getroffen wurde
        if ($SelectedActions.Count -eq 0) {
            Write-Host "❌ Ungültige Auswahl! Bitte erneut ausführen." -ForegroundColor Red  
            return
        }
    }

    # Alle ausgewählten Actions werden lokal ausgeführt
    foreach ($ActionName in $SelectedActions) {
        $ActionID = $ActionMap[$ActionName]
        Write-Host "`n🔄 Starte CCM-Aktion '$ActionName' lokal..." -ForegroundColor Cyan  
        
        try {
            # Lokale WMI-Methode für Triggern der CCM-Aktion verwenden
            Invoke-WmiMethod -Namespace "root\ccm" -Class "SMS_Client" -Name "TriggerSchedule" -ArgumentList $ActionID | Out-Null  
            Write-Host "✅ CCM-Aktion '$ActionName' erfolgreich lokal ausgeführt." -ForegroundColor Green  
        } catch {
            Write-Host "❌ Fehler beim Ausführen der CCM-Aktion '$ActionName' lokal: $_" -ForegroundColor Red  
        }
    }
}
Invoke-LocalCCMActions -Actions '$Actions'  
"@  

Klappt aber nicht..

Fehlermeldung

Es ist nicht möglich, einen Index auf ein NULL-Array anzuwenden.
In Zeile:54 Zeichen:38
+             Write-Host "$($i + 1). $($ActionsSorted[$i])"  
+                                      ~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : NullArray

Möchte das er das einfach "macht" :D ohne irgendwelche Variablen ggfs ausfüllen oder ausführen etc..
Hilfeeeeeeeeeeeeeeeeeeeeee

Hintegrrund ist das erstellen eines Task

function Create-ScheduledTask {
    param (
        [string]$Actions               # Optional: Kommagetrennte Liste von Action-Nummern oder Namen
    )

    # Ordner zum Speichern des Skripts
    $TaskFolder = "C:\Windows\CCMTasks"  
    
    # Sicherstellen, dass der Ordner existiert
    if (-not (Test-Path $TaskFolder)) {
        New-Item -Path $TaskFolder -ItemType Directory -Force
    }

    # Skript für das Starten der Actions speichern
    $ScriptPath = "$TaskFolder\InvokeCCMActions.ps1"  
    $ScriptContent = @"  
Hier soll die Funktion komplett stehen
Invoke-LocalCCMActions -Actions '$Actions'  
"@  
    Set-Content -Path $ScriptPath -Value $ScriptContent -Force

    # Erstellen der geplanten Aufgabe
    $TaskName = "RunCCMActionsOnStartup"  
    $Action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-ExecutionPolicy Bypass -File $ScriptPath"  
    $Trigger = New-ScheduledTaskTrigger -AtStartup
    $Principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount  

    # Aufgabe registrieren
    try {
        Register-ScheduledTask -Action $Action -Principal $Principal -Trigger $Trigger -TaskName $TaskName
        Write-Host "✅ Geplante Aufgabe '$TaskName' erfolgreich erstellt!" -ForegroundColor Green  
    } catch {
        Write-Host "❌ Fehler beim Erstellen der geplanten Aufgabe: $_" -ForegroundColor Red  
    }
}

Und ausführen via Create-ScheduledTask -Actions "1,2,3" # Beispielaktionen (z.B. HardwareInventory, MachinePolicyRequest)

Task wird erstellt, Datei auch, aber totale grütze was drinsteht.

Wie kann ich hier einfach ein PS SKript als String speichern?????

LG

Content-ID: 671642

Url: https://administrator.de/forum/ps-skript-als-string-speichern-671642.html

Ausgedruckt am: 26.02.2025 um 17:02 Uhr

mediodia
Lösung mediodia 26.02.2025 aktualisiert um 15:25:07 Uhr
Goto Top
Invoke-LocalCCMActions -Actions '$Actions'
$actions gibt es ja erstens nirgendwo und zweitens werden Variablen in Hochkommas nicht expandiert ...
Außerdem werden Variablen innerhalb des HereStrings schon beim Definieren expandiert, dort nimmst du dann stattdessen Hochkommas damit das nicht passiert

Wie kann ich hier einfach ein PS SKript als String speichern?????
# Variable
$var = 'Meister Röhrich'  
# script als string
$script = @'  
write-host "Hallo $var"  
'@  
# script ausführen
Invoke-Expression $script
pixel0815
pixel0815 26.02.2025 um 15:37:19 Uhr
Goto Top
Ja die Hochkommas waren es!!! :D Dankeschöööööööööööööööööön, jetzt läuft alles so wie es sein sollte.
DivideByZero
DivideByZero 26.02.2025 um 16:11:45 Uhr
Goto Top
Moin,

ein bisschen Lektüre zum Vertiefen:

von Microsoft: Alles, was Sie schon immer über die Variablenersetzung in Zeichenfolgen wissen wollten

Und schön aufbereitet von @colinardo: Powershell Leitfaden für Anfänger

Gruß

DivideByZero