PowerShell: Когда использовать Add-Type и New-Object ?
В этом блоге я расскажу, когда вам нужно добавлять классы с помощью Add-Type и когда вы можете предоставлять классы с помощью New-Object. Я бы сказал, давайте начнем.
New-Object
Предопределенные классы .NET: PowerShell делает определенные предопределенные классы .NET непосредственно доступными, без необходимости загружать их с помощью “Add-Type”.
Вы можете просто использовать «New-Object» для создания экземпляров этих классов. Это включает в себя многие общепринятые классы, такие как «System.String», «System.DateTime», «System.IO.FileInfo».
Вот несколько примеров:
$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
Пользовательские классы или внешние сборки .NET: если вы создали пользовательский класс .NET или хотите получить доступ к функциям и классам во внешних сборках .NET, которые по умолчанию недоступны в PowerShell, вы должны использовать “Add-Type”, чтобы загрузить класс или сборку во время выполнения. После этого вы можете использовать “New-Object”, чтобы создавать экземпляры этих загруженных классов.
Вот несколько примеров:
[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")
}
Кстати, вы можете перечислить все предопределенные классы, которые доступны без необходимости загружать их в сессию.
Get-TypeData -TypeName '*'
Я надеюсь, что это было полезно и хорошо объяснено. Увидимся в следующий раз.
