3 min read
IT-Automation für maximale Effizienz nutzen
Bist du bereit für eine Transformation deines IT-Mangements? Unser brandneues Whitepaper, Maximizing IT Automation: The...
ScriptRunner Blog
PSDefaultParameterValues ist eine Hashtabelle, mit der wir die Standardwerte eines beliebigen Parameters für ein beliebiges Cmdlet mit den von uns gewünschten Standardwerten überschreiben können.
Das Cmdlets verwendet dann den benutzerdefinierten Standardwert, sofern im Befehl kein anderer Wert angeben wird.
Das klingt vielleicht nicht nach der wichtigsten Funktion, aber glauben Sie mir, nach diesem Beitrag werden Sie sich fragen, wie Sie jemals ohne sie gearbeitet haben.
Parameter
Schauen wir uns genauer an, wie man einen Standardwert festlegt.
$PSDefaulParameterValues.Add("Command:Parameter","Value")
Wie Sie sehen können, fügen wir einfach einen neuen Schlüssel zur Hashtabelle hinzu und geben das Cmdlet und den Parameter an, für den ein Standardwert festgelegt werden soll, getrennt durch ein : .
Der Wert muss natürlich von einem Typ sein, der vom Parameter akzeptiert wird, sonst erhalten Sie Fehler bei der Verwendung des Cmdlets.
Ein konkretes Beispiel wäre die Angabe eines benutzerdefinierten Trennzeichens für Write-Host.
# Default PS> Write-Host "Hello","World" Hello World # Adding the custom default PS> $PSDefaultParameterValues.Add("Write-Host:Separator", "`n") # Changed output PS> Write-Host "Hello","World" Hello World
Für Switch-Parameter gilt fast dasselbe, wir verwenden nur einen Booleschen Wert, um anzugeben, ob der Schalter vorhanden $true oder nicht vorhanden $false sein soll.
Wir könnten ihn z. B. verwenden, um das Debugging für alle Invoke-WebRequest-Aufrufe in einem Skript auf einmal zu aktivieren.
# Default, no verbosity PS> (Invoke-WebRequest "https://ps1.guru").StatusCode 200 # Adding the custom default PS> $PSDefaultParameterValues.Add("Invoke-WebRequest:Verbose", $true) # Changed output, with verbosity PS> (Invoke-WebRequest "https://ps1.guru").StatusCode VERBOSE: GET https://ps1.guru/ with 0-byte payload VERBOSE: received 4801-byte response of content type text/html 200
Wir bleiben beim Verbose-Parameter aus dem vorherigen Beispiel und können ihn mit Platzhaltern für alle Cmdlets festlegen. Dies ist ein nützlicher Trick, den ich häufig zum Debuggen meiner Scripts verwende.
PS> $PSDefaultParameterValues.Add("*:Verbose", $true)
Anstelle eines statischen Werts ist es möglich, einen Scriptblock als Vorgabe für einen Parameter zu verwenden. Dies ermöglicht ein extremes Maß an Anpassung in Abhängigkeit von Systemzuständen wie dem Host, auf dem Sie sich befinden, dem aktuellen Verzeichnis und vielem mehr.
Um bei unserem Verbosität-Beispiel von vorhin zu bleiben, könnten wir das Verhalten von einer Variable $verbose abhängig machen.
PS> $PSDefaultParameterValues.Add("*:Verbose", {$verbose -eq $true})
Jetzt können wir die standardmäßige Verbosität unserer Sitzung durch Setzen und Entfernen einer Variable steuern. Denken Sie daran, dass dieser Scriptblock jedes Mal ausgeführt wird, wenn Sie das Cmdlet verwenden, also halten Sie ihn schnell.
Sie können ihn wie folgt messen:
PS> Measure-Command {$verbose -eq $true} | ft Days Hours Minutes Seconds Milliseconds ---- ----- ------- ------- ------------ 0 0 0 0 0
Alles, was wir bis jetzt gemacht haben, bleibt nicht zwischen Sitzungen bestehen. Damit die Standardwerte dies tun, müssen Sie sie zu Ihrem Profil hinzufügen. Um alle Vorgaben zu finden, die Sie in der aktuellen Sitzung hinzugefügt haben, fragen Sie einfach die Historie wie folgt ab.
Get-History | Where-Object CommandLine -like "`$PSDEfaultParameterValues*"
Sie fragen sich vielleicht, warum das nützlich sein soll, lassen Sie es mich an einem kurzen Beispiel zeigen.
Angenommen, Sie exportieren immer Daten in CSV-Dateien, die jemand in Excel öffnen soll. Wenn er einfach auf Ihre CSV-Datei doppelklickt, wird das Ergebnis nicht besonders gut sein.
Get-Process -Name Microsoft* | Export-Csv msproc.csv
können Sie ein benutzerdefiniertes Trennzeichen angeben und dabei Typinformationen und Klammern entfernen:
Get-Process -Name Microsoft* | Export-Csv bettermsproc.csv -Delimiter ";" -NoTypeInformation -NoClobber
Jetzt wird beim Importieren, Exportieren, Konvertieren von und Konvertieren nach CSV das Trennzeichen ; verwendet und keine Typinformationen oder Klammern sind enthalten.
Wenn Sie die resultierende CSV-Datei direkt mit Excel öffnen, sehen Sie ein Ergebnis, das dem des Datenimport-Tanzes ähnelt, den wir vorher gemacht haben.
$PSDefaultParams.Add("Export-Csv:Delimiter", ";") $PSDefaultParams.Add("Export-Csv:NoTypeInformation", $true) $PSDefaultParams.Add("Export-Csv:NoClobber", $true)
Damit können wir zurückgehen und einfach Export-Csv verwenden und die resultierende Datei wird in Excel genau wie erwartet geöffnet.
Wir könnten sogar noch einen Schritt weiter gehen und diese Parameter für alle Cmdlets in der CSV-Familie mithilfe von Platzhaltern ändern.
$PSDefaultParams.Add("*-Csv:Delimiter", ";") $PSDefaultParams.Add("*-Csv:NoTypeInformation", $true) $PSDefaultParams.Add("*-Csv:NoClobber", $true)
Nachdem Sie nun etwas über $PSDefaulParameterValues erfahren haben, möchte ich Sie warnen – verwenden Sie sie bitte nicht in Ihren Scripts.
Dafür gibt es einige gute Gründe:
Um dies zu vermeiden, empfehle ich Ihnen PSDefaultParameterValues zuerst in allen Scripten zu deaktivieren:
# Disable PSDefaultParameterValues $PSDefaultParameterValues.Add("Disabled", $true)
Und sie am Ende wieder zu aktivieren:
# Re-Enable PSDefaultParameterValues $PSDefaultParameterValues.Remove("Disabled")
Nov 28, 2024 by Heiko Brenn
Bist du bereit für eine Transformation deines IT-Mangements? Unser brandneues Whitepaper, Maximizing IT Automation: The...
Okt 30, 2024 by Damian Scoles
MVP Damien Scoles berichtet über seine Erfahrungen mit Microsoft Graph. In seinem dritten Artikel geht er näher auf...
Okt 16, 2024 by Damian Scoles
Wie unterscheidet sich die Exchange Online-Administration mit dem Microsoft Graph PowerShell-Modul vom herkömmlichen...
Marco ist im Herzen ein DevOps-Ingenieur und verwendet PowerShell in Kombination mit anderen Stacks, um die Bereitstellung zu automatisieren, Datenanalysen durchzuführen und Unternehmen in die Cloud zu bringen. Er verwendet PowerShell seit 2018 auf allen Plattformen als seine primäre Befehlszeile und versucht immer, mehr Leute dazu zu bewegen, von bash und anderen zu wechseln.