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
Hätte jetzt quasi die Funktion einfach dort hineinkopiert
Klappt aber nicht..
Fehlermeldung
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
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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 671642
Url: https://administrator.de/forum/ps-skript-als-string-speichern-671642.html
Ausgedruckt am: 26.02.2025 um 17:02 Uhr
3 Kommentare
Neuester Kommentar
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
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
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