PowerShell: Wann sollte man Add-Type und New-Object verwenden?
In diesem Blogbeitrag werde ich darüber sprechen, wann Sie Klassen mit Add-Type hinzufügen müssen und wann Sie Klassen mit New-Object bereitstellen können. Ich würde sagen, fangen wir an.
New-Object
Vordefinierte .NET-Klassen: PowerShell stellt bestimmte vordefinierte .NET-Klassen direkt zur Verfügung, ohne dass Sie sie mit „Add-Type“ laden müssen.
Sie können einfach "New-Object" verwenden, um Instanzen dieser Klassen zu erstellen. Dazu gehören viele häufig verwendete Klassen wie "System.String", "System.DateTime", "System.IO.FileInfo".
Hier sind einige Beispiele:
$player = New-Object System.Media.SoundPlayer "$env:windir\Media\windows logon.wav" -Verbose
$player | Get-Member
$player.PlayLooping() # Methode tu etwas ==> Looping
$player.Stop() # Methode ==> Stop
[System.Math]::Round('123.6',0)
Add-Type
Benutzerdefinierte Klassen oder externe .NET-Assemblys: Wenn Sie eine benutzerdefinierte .NET-Klasse erstellt haben oder Funktionen und Klassen in externen .NET-Assemblys aufrufen möchten, die standardmäßig nicht in PowerShell verfügbar sind, müssen Sie “Add-Type” verwenden, um die Klasse oder Assembly zur Laufzeit zu laden. Danach können Sie “New-Object” verwenden, um Instanzen dieser geladenen Klassen zu erstellen.
Hier sind einige Beispiele:
[Microsoft.VisualBasic]::InputBox("Enter a computer name", "Computer") # Error. Wird nicht gefunden
Add-Type -AssemblyName Microsoft.VisualBasic # adds a .NET class to this session
$computer = [Microsoft.VisualBasic.Interaction]::InputBox("Enter a computer name", "Computer")
$Test = Test-Connection -ComputerName $computer -Count 1 -ErrorAction SilentlyContinue
If ($Test.Status -eq 'Success') {
[Microsoft.VisualBasic.Interaction]::MsgBox("Test for $computer successful.", "OKOnly,SystemModal,Information", "Success")
}
else {
[Microsoft.VisualBasic.Interaction]::MsgBox("Test for $computer failed.", "OKOnly,SystemModal,Critical", "Error")
}
Übrigens können Sie alle vordefinierten Klassen auflisten, die ohne deren Laden in die Sitzung zugänglich sind.
Get-TypeData -TypeName '*'
Ich hoffe, das war hilfreich und gut erklärt. Bis zum nächsten Mal.
