相当于C#的“使用”关键字在PowerShell中?

当在C#中的.net-Framework中使用另一个对象时,我可以使用using指令节省大量的input。

using FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It; ... var blurb = new Thingamabob(); ... 

那么在Powershell中有没有办法做类似的事情? 我正在访问很多的.net对象,不喜欢input

  $blurb = new-object FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It.Thingamabob; 

每时每刻。

看看几年前的博客文章: 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) 

基本上我所做的就是抓取非平凡types的程序集,然后编写一个“构造函数”,使用Add-Member将它们(以结构化的方式)添加到我关心的对象中。

另见这个后续文章: http ://richardberg.net/blog/?p=38

这样的命名空间没有任何东西。 我经常将常用types分配给variables,然后实例化它们:

 $thingtype = [FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It.Thingamabob]; $blurb = New-Object $thingtype.FullName 

可能不值得,如果types不会重复使用,但我相信这是你能做的最好的。

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() 

(第一行的#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中可以添加types别名的代码。 但问题是它没有范围。 通过一些额外的工作,您可以“取消”导入命名空间,但是这会让您获得一个良好的开端。

 ############################################################################## #.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) } } } } 

如果您只需要创buildtypes的实例,则可以将长名称空间的名称存储在string中:

 $st = "System.Text" $sb = New-Object "$st.StringBuilder" 

它不像C#中的using指令那么强大,但是至less它使用起来非常简单。

谢谢大家的意见。 我把理查德·伯格的贡献标记为答案,因为它与我正在寻找的内容非常相似。

所有的答案都让我看到了最有希望的轨道:在他的博客中, Keith Dahlby提出了一个Get-Type命令行,可以方便地构build通用方法的types。

我认为没有理由反对这样做,也search一个types的程序集的预定义path。

免责声明:我还没有build立 – 但…

以下是如何使用它:

 $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通用列表。 当然,我会在另一个实用程序函数中将path定义结束。 扩展的get-type将包括一个步骤来parsing任何给定types的path。

 #Requires -Version 5 using namespace System.Management.Automation.Host #using module 

我意识到这是一个旧的post,但我正在寻找同样的事情,并遇到这个: http : //weblogs.asp.net/adweigert/powershell-adding-the-using-statement

编辑:我想我应该指定它允许您使用熟悉的语法…

 using ($x = $y) { ... }