Поиск по сайту:

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 '*'

Я надеюсь, что это было полезно и хорошо объяснено. Увидимся в следующий раз.