Sử dụng không gian tên trong Powershell


9

Suy nghĩ về nó trong khi trả lời câu hỏi này .

Làm thế nào bạn có thể tránh sự cần thiết phải đủ điều kiện mỗi loại duy nhất trong một không gian tên?

Nó thực sự, thực sự tẻ nhạt để viết System.Security.Cryptography.X509Certificates.X509Storethay vì X509Store, hoặc [System.Security.Cryptography.X509Certificates.StoreName]::Mythay vì [StoreName]::My.

Trong C # bạn có usingchỉ thị ... còn Powershell thì sao?


EDIT 1 - Điều này hoạt động cho các loại:

$ns = "System.Security.Cryptography.X509Certificates"
$store = New-Object "$ns.X509Store"(StoreName,StoreLocation)

New-Object lấy một chuỗi ký tự là định nghĩa kiểu, vì vậy nó có thể được xây dựng theo chương trình.


EDIT 2 - Công việc này dành cho các thành viên liệt kê được sử dụng làm tham số:

$store = New-Object "$ns.X509Store"("My","LocalMachine")

Trong đó "Của tôi" là [System.Security.Cryptography.X509Certificates.StoreName]::Myvà "LocalMachine" [System.Security.Cryptography.X509Certificates.StoreLocation]::LocalMachine.
Tên theo nghĩa đen được tự động chuyển đổi thành thành viên liệt kê, nếu được đặt ở nơi dự kiến ​​sẽ có thành viên liệt kê.


Ngay tại đó với bạn về điều này.
Joseph Kern

Câu trả lời:


11

Tôi biết, hơi muộn một chút, nhưng PowerShell v5 bổ sung hàng tấn ngôn ngữ thú vị. Một trong số đó là "sử dụng không gian tên".

PS> using namespace System.Security.Cryptography.X509Certificates; [X509Store]


IsPublic IsSerial Name                                     BaseType                                     
-------- -------- ----                                     --------                                     
True     False    X509Store                                System.Object                                

6

Đối với bảng liệt kê, bạn không phải chỉ định tên toàn bộ loại. Ví dụ:

Bạn có thể làm được việc này:

New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext([System.DirectoryServices.ActiveDirectory.DirectoryContextType]::Domain)

hoặc phiên bản đơn giản hơn nhiều:

New-Object System.DirectoryServices.ActiveDirectory.DirectoryContext('Domain')

Bạn có thể sử dụng chuỗi để xác định các liệt kê bạn muốn sử dụng mà không phải sử dụng tên được trang trí đầy đủ. PowerShell xử lý kiểu chữ cho bạn chuyển đổi các chuỗi thành các giá trị liệt kê. Sử dụng ví dụ cụ thể mà bạn đã trình bày ở trên, điều đó có nghĩa là bạn có thể làm điều này:

[System.Security.Cryptography.X509Certificates.OpenFlags]'ReadWrite'

Và Powershell sẽ chuyển đổi nó một cách chính xác (vì vậy việc chuyển 'ReadWrite' sang một tham số lấy giá trị liệt kê OpenFlags sẽ hoạt động tốt). Nếu bạn muốn truyền nhiều giá trị, bạn có thể làm như thế này:

[System.Security.Cryptography.X509Certificates.OpenFlags]@('ReadWrite','IncludeArchived')

Lưu ý rằng tôi đang thêm tiền tố vào các lệnh này với tên loại, nhưng nếu bạn chuyển chúng đến một tham số đã nhập, bạn chỉ cần bỏ nó đi.

Điều đó sẽ giúp bạn tiến một bước gần hơn để có thể viết các tập lệnh hoạt động với một không gian tên cụ thể mà không phải trang trí tất cả các tên.


Điều này làm việc tuyệt vời, cảm ơn. Tôi chỉ hy vọng không bao giờ tìm thấy một phương thức quá tải có thể lấy tham số là hai cách liệt kê khác nhau có thành viên có cùng tên :-)
Massimo

Chấp nhận điều này vì mẹo này rất hữu ích, nhưng vấn đề vẫn còn khá xa mới được giải quyết ...: - /
Massimo

0

Đúng cách?

$_m = [math]
$_m::sin((45*($_m::pi/180))) 

Và điều này dường như hoạt động:

[Reflection.Assembly]::Load("System.Security, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a")

$stoopidnamespace = 'System.Security.Cryptography.X509Certificates.X509Store'
New-Object $stoopidnamespace($null)

Nhưng thật xấu xí khi bạn làm điều này:

$stoopidnamespace = 'System.Security.Cryptography.X509Certificates'
New-Object $stoopidnamespace'.X509Store'($null)

3
$ Something = [type] chỉ hoạt động cho một định nghĩa loại duy nhất, không phải cho toàn bộ không gian tên. Nó hoạt động cho "Math" vì đó là một lớp.
Massimo

... Tôi thực sự cần nghiên cứu về quyền hạn hơn ...
Joseph Kern
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.