PowerShell - установка псевдонима для загруженной сборки - PullRequest
7 голосов
/ 27 марта 2010

Я использую этот код для загрузки сборки .Net в PowerShell:

[System.Reflection.Assembly]::Load("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") | out-null 
[System.Windows.Forms.MessageBox]::Show("Hello world")

Могу ли я установить псевдоним для сборки (например: 'System.Windows.Forms' = 'Forms'), чтобы мне не приходилось вводить полное имя сборки при вызове статических методов, таких как MessageBox.Show ( )

Ответы [ 4 ]

12 голосов
/ 27 марта 2010

Вы можете сохранить тип в переменной и использовать переменную

$forms = [System.Windows.Forms.MessageBox]
$forms::Show('Hello')

И в этом случае вы можете загрузить сборку так:

Add-Type –assembly system.windows.forms
5 голосов
/ 27 марта 2010

Хотя вы не можете создать какой-то псевдоним пространства имен как таковой, вы можете использовать следующую уловку (взята из книги повара PowerShell Ли Холмса):

$namespace = "System.Windows.Forms.{0}"
$form = New-Object ($namespace -f "Form")

Но это будет работать только с New-Object, поскольку для имени класса требуется строка. Вы не можете использовать этот синтаксис с именем типа в квадратных скобках.

Что вы можете сделать, тем не менее, пропустить часть System, которая подразумевается:

[Windows.Forms.MessageBox]::Show("Hello World!")

Делает его немного короче.

1 голос
/ 11 марта 2014

Используя Joey ответ, вы можете использовать эту функцию, чтобы установить "псевдонимы" для сборок. Он в основном назначает сборку функции с именем заданного псевдонима, который вы хотите.

function Global:Add_Assembly_Alias($STR_assembly, $alias) {

    [string]$assembly = "$STR_assembly.{0}"
    $ExecutionContext.InvokeCommand.InvokeScript(
        $ExecutionContext.InvokeCommand.NewScriptBlock("
            function Global:$alias(`$namespace) {
                [string](`"$assembly`" -f `$namespace)
            }
        ")
    )
}

например. если вы хотите назначить System.Windows.Forms для wforms, вы бы вызвали основную функцию как

Add_Assembly_Alias System.Windows.Forms wforms

Она генерирует вам функцию под названием «wforms» с пространством имен в качестве аргумента, который вы можете использовать для добавления новых объектов и т. Д. Если вы хотите добавить, например, объект текстового поля, вам просто нужно вызвать

$tb = new-object (wforms TextBox)

Это немного, но я думаю, что это настолько близко, насколько вы можете назначить сборку чему-то похожему на псевдоним. К сожалению, мне не удалось реализовать это для прямых звонков вида

[Windows.Forms.MessageBox]::Show("Hello World!")

но я надеюсь, что это все еще помогает.

Ура, D

0 голосов
/ 12 августа 2016

Вы можете добавить ускоритель типа Powershell (псевдоним для типа):

$accel = [PowerShell].Assembly.GetType("System.Management.Automation.TypeAccelerators")
$accel::add("mb","System.Windows.Forms.MessageBox")
[mb]::Show("Hello world")

Более подробную информацию можно найти здесь и здесь .

С PowerShell 5 вы также можете импортировать пространства имен:

using namespace System.Windows.Forms
[MessageBox]::Show("Hello world")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...