2010-03-27 33 views
6

tôi sử dụng mã này để tải một Net lắp ráp để PowerShell:PowerShell - Set Bí danh cho hội Loaded

[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") 

Tôi có thể thiết lập một bí danh cho một assembly (ví dụ: 'System.Windows.Forms '=' Forms ') để tôi không phải gõ tên đầy đủ của assembly khi gọi một phương thức tĩnh như MessageBox.Show()?

Trả lời

5

Trong khi bạn không thể tạo một số loại không gian tên bí danh cho mỗi gia nhập, bạn có thể sử dụng các thủ thuật sau đây (lấy từ PowerShell Cookbook Lee Holmes'):

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

Nhưng điều đó sẽ chỉ làm việc với New-Object vì đó lấy một chuỗi cho tên lớp. Bạn không thể sử dụng cú pháp đó với tên kiểu trong dấu ngoặc vuông.

Những gì bạn có thể làm, tuy nhiên, là bỏ qua System phần được ngụ ý:

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

Làm cho nó hơi ngắn hơn.

+0

Cảm ơn bạn cho cả trả lời –

+0

Tôi không biết về hệ thống được ngụ ý. Cảm ơn! – Kleinux

+0

@Kleinux: Nó hoạt động để chỉ các kiểu, đó là lý do tại sao bạn có thể viết '[datetime]' thay vì '[system.datetime]' nhưng nó sẽ không hoạt động để nạp một assembly (nghĩa là 'Add-Type - Assembly Windows.Forms' sẽ không hoạt động). – Joey

10

Bạn có thể lưu trữ các loại trong biến và sử dụng biến

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

Và trong trường hợp này bạn có thể tải lắp ráp như thế này:

Add-Type –assembly system.windows.forms 
1

Sử dụng Joey 's câu trả lời, bạn có thể sử dụng này để đặt "bí danh" thành các hội đồng. Về cơ bản nó gán một assembly cho một hàm với tên của bí danh mà bạn muốn.

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) 
      } 
     ") 
    ) 
} 

Ví dụ: nếu bạn muốn gán System.Windows.Forms để wforms bạn sẽ gọi hàm chính như

Add_Assembly_Alias System.Windows.Forms wforms 

Nó tạo cho bạn những chức năng được gọi là "wforms" với không gian tên như là đối số mà bạn có thể sử dụng để thêm các đối tượng mới vv Nếu bạn muốn thêm ví dụ một đối tượng hộp văn bản bạn sẽ chỉ cần gọi

$tb = new-object (wforms TextBox) 

Nó không nhiều, nhưng tôi nghĩ điều này gần như bạn có thể gán một assembly cho một cái gì đó tương tự như một bí danh. Rất tiếc, tôi không quản lý điều này cho các cuộc gọi trực tiếp của biểu mẫu

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

nhưng tôi hy vọng điều này vẫn hữu ích.

Chúc mừng, D

0

Bạn có thể thêm Powershell loại gia tốc (bí danh cho loại):

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

Thông tin chi tiết có thể được tìm thấy herehere.

với PowerShell 5 bạn cũng có thể nhập không gian tên:

using namespace System.Windows.Forms 
[MessageBox]::Show("Hello world")