Эквивалентно ключевому слову C# "using" в powershell?
когда я использую другой объект в .net-Framework в C#, я могу сохранить много ввода с помощью директивы using.
using FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It;
...
var blurb = new Thingamabob();
...
Так есть ли способ в Powershell сделать что-то подобное? Я получаю доступ к большому количеству объектов .net и не рад тому, что мне нужно ввести
$blurb = new-object FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It.Thingamabob;
все время.
9 ответов:
проверьте это сообщение в блоге от пару лет назад: http://blogs.msdn.com/richardb/archive/2007/02/21/add-types-ps1-poor-man-s-using-for-powershell.aspx
здесь
add-types.ps1
, выдержки из этой статьи:param( [string] $assemblyName = $(throw 'assemblyName is required'), [object] $object ) process { if ($_) { $object = $_ } if (! $object) { throw 'must pass an -object parameter or pipe one in' } # load the required dll $assembly = [System.Reflection.Assembly]::LoadWithPartialName($assemblyName) # add each type as a member property $assembly.GetTypes() | where {$_.ispublic -and !$_.IsSubclassOf( [Exception] ) -and $_.name -notmatch "event"} | foreach { # avoid error messages in case it already exists if (! ($object | get-member $_.name)) { add-member noteproperty $_.name $_ -inputobject $object } } }
и, чтобы использовать его:
RICBERG470> $tfs | add-types "Microsoft.TeamFoundation.VersionControl.Client" RICBERG470> $itemSpec = new-object $tfs.itemspec("$/foo", $tfs.RecursionType::none)
В основном то, что я делаю, это обход сборки для нетривиальных типов, а затем написать "конструктор", который использует Add-Member добавить их (в структурированном виде) к объектам я забочусь о.
см. также следующее сообщение:http://richardberg.net/blog/?p=38
на уровне пространства имен нет ничего подобного. Я часто назначаю часто используемые типы переменным, а затем создаю их экземпляр:
$thingtype = [FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It.Thingamabob]; $blurb = New-Object $thingtype.FullName
вероятно, не стоит, если тип не будет использоваться повторно, но я считаю, что это лучшее, что вы можете сделать.
PowerShell 5.0 (входит в WMF5 или Windows 10 и выше), добавляет
using namespace
создать язык. Вы можете использовать его в своем скрипте так:#Require -Version 5.0 using namespace FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It $blurb = [Thingamabob]::new()
(The
#Require
оператор в первой строке не обязательно использоватьusing namespace
, но это предотвратит запуск скрипта в PS 4.0 и ниже, гдеusing namespace
ошибка синтаксиса.)
это просто шутка, шутка...
$fullnames = New-Object ( [System.Collections.Generic.List``1].MakeGenericType( [String]) ); function using ( $name ) { foreach ( $type in [Reflection.Assembly]::LoadWithPartialName($name).GetTypes() ) { $fullnames.Add($type.fullname); } } function new ( $name ) { $fullname = $fullnames -like "*.$name"; return , (New-Object $fullname[0]); } using System.Windows.Forms using FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It $a = new button $b = new Thingamabob
вот код, который работает в PowerShell 2.0 для добавления псевдонимов типов. Но проблема в том, что он не ограничен. С некоторой дополнительной работой вы можете "отменить импорт" пространств имен, но это должно привести вас к хорошему началу.
############################################################################## #.SYNOPSIS # Add a type accelerator to the current session. # #.DESCRIPTION # The Add-TypeAccelerator function allows you to add a simple type accelerator # (like [regex]) for a longer type (like [System.Text.RegularExpressions.Regex]). # #.PARAMETER Name # The short form accelerator should be just the name you want to use (without # square brackets). # #.PARAMETER Type # The type you want the accelerator to accelerate. # #.PARAMETER Force # Overwrites any existing type alias. # #.EXAMPLE # Add-TypeAccelerator List "System.Collections.Generic.List``1" # $MyList = New-Object List[String] ############################################################################## function Add-TypeAccelerator { [CmdletBinding()] param( [Parameter(Position=1,Mandatory=$true,ValueFromPipelineByPropertyName=$true)] [String[]]$Name, [Parameter(Position=2,Mandatory=$true,ValueFromPipeline=$true)] [Type]$Type, [Parameter()] [Switch]$Force ) process { $TypeAccelerators = [Type]::GetType('System.Management.Automation.TypeAccelerators') foreach ($a in $Name) { if ( $TypeAccelerators::Get.ContainsKey($a) ) { if ( $Force ) { $TypeAccelerators::Remove($a) | Out-Null $TypeAccelerators::Add($a,$Type) } elseif ( $Type -ne $TypeAccelerators::Get[$a] ) { Write-Error "$a is already mapped to $($TypeAccelerators::Get[$a])" } } else { $TypeAccelerators::Add($a, $Type) } } } }
Если вам просто нужно создать экземпляр этого типа, вы можете хранить имя пространства имен длиной в строку:
$st = "System.Text" $sb = New-Object "$st.StringBuilder"
это не так мощно, как
using
директива в C#, но по крайней мере она очень проста в использовании.
спасибо всем за Ваш вклад. Я отметил вклад Ричарда Берга в качестве ответа, потому что он больше всего напоминает то, что я ищу.
все ваши ответы привели меня на трек, который кажется наиболее перспективным: In его сообщение в блоге Кит Далби предлагает командлет Get-Type, который позволяет легко создавать типы для универсальных методов.
Я думаю, что нет причин против exetending это также искать через предопределенный путь сборок для типа.
отказ от ответственности: я еще не построил это-пока ...
вот как это можно использовать:
$path = (System.Collections.Generic, FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It) $type = get-type -Path $path List Thingamabob $obj = new-object $type $obj.GetType()
это приведет к хорошему общему списку Thingamabob. Конечно, я бы обернул все без определения пути в другую функцию полезности. Расширенный get-тип будет включать в себя шаг для разрешения любого заданного типа agains путь.
Я понимаю, что это старый пост, но я искал то же самое и наткнулся на это: http://weblogs.asp.net/adweigert/powershell-adding-the-using-statement
Edit: я полагаю, я должен указать, что он позволяет использовать знакомый синтаксис...
using ($x = $y) { ... }