2009-06-26 17 views
63

C#の.net-Frameworkで別のオブジェクトを使用すると、usingディレクティブを使用して多くの型を節約できます。C#のpowershellの "using"キーワードに相当しますか?

それでは、Powershellには何か似たようなことがありますか?私は多くの.netオブジェクトにアクセスしているので、入力する必要がありません。

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

答えて

11

数年前からこのブログ記事をご覧ください:ここで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) 

基本的に私が行うことは、重要でないタイプのアセンブリをクロールしてから、 "con Add-Memberを使用する「structor」は、私が気にするオブジェクトに(構造化された方法で)それらを追加します。あなたの入力のためのhttp://richardberg.net/blog/?p=38これは単なる冗談、冗談です

+0

タイプ名(System.IO.Pathなど)の代わりにアセンブリ名(例:mscorlib)を使用する必要があるようです。 –

+0

オブジェクトに関数を渡すことができない場合は、 'New-Object PSObject'を使ってオブジェクトを作成することができます。 –

53

このような名前空間レベルには、実際には何もありません。私は、多くの場合、変数に一般的に使用されるタイプを割り当て、それらをインスタンス化します。それ

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

おそらく価値がないタイプは繰り返し使用しない場合、私はそれはあなたができる最善だと信じています。

+0

時にはSecureStringをプレーンテキストに変換する必要があります。次のように便利です: '$ ns = [System.Runtime.InteropServices.Marshal]'それから '$ ns :: PtrToStringAuto($ ns :: SecureStringToBSTR($ ss))'を実行できます。 – petrsnd

+0

PowerShell 5.0はこれを解決します。 –

6

...

$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 
+0

誰かがダブルの '' 1 ''型を説明してもらえますか?私は検索するのが難しいと思っています。 – Pete

+0

これはC#usingステートメントと同じで、usingステートメントではありません。 –

+0

私はこのように見えます。あなたがそれにコミットするなら、これは私にとって非常にエレガントな解決策のようです。新しい構文を作成する際のPowerShellの柔軟性により、私は非常に満足しています。 –

2

おかげでみんな:

も、このフォローアップ記事を参照してください。私はリチャード・ベルクの貢献を答えとしてマークしました。なぜなら、それは私が探しているものに最も似ているからです。

あなたの答えはすべて、最も有望であると思われるトラックに私をもたらしました。his blog postでKeith Dahlbyはジェネリックメソッドの型を簡単にコンコンストラクションできるGet-Typeコマンドレットを提案しています。

これは、あるタイプのアセンブリの定義済みパスでも検索することを拒否する理由がないと思います。

$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の素敵なジェネリックリストにつながる: - :

免責事項ここで

は1がそれを使用することができる方法で、まだ...私はそれを内蔵していません。もちろん、私はすべてのものを包み込み、もう一つのユーティリティー機能の中でパス定義を捨ててしまいます。拡張get-typeには、指定された型のパスを解決するためのステップが含まれます。

5

次は、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) 
      } 
     } 

    } 

} 
+0

ジョシュ、私はタイプアクセラレータを拡張することをまだ見ていなかった。これは非常に面白いです、私はそれを少し周りに再生すると思います。 – froh42

+0

便利ですが、注意して使用してください。誰か他のマシンで動作しないスクリプトを作成するよりも悪いことはありません。そのため私は決してこれらのアクセラレータを私のプロファイルに入れません。何かがあれば、スクリプトの先頭に追加して、すぐにAdd-TypeAcceleratorで失敗するようにします。 – Josh

4

あなたはちょうどあなたが文字列の長い名前空間の名前を格納することができ、あなたのタイプのインスタンスを作成する必要がある場合:

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

それは、C#でusingディレクティブほど強力ではありませんが、少なくとも、使い方は簡単です。

-2

私はこれは古い記事で実現するが、私は同じものを探していると、この出くわした:http://weblogs.asp.net/adweigert/powershell-adding-the-using-statement

編集:私は、私はそれはあなたが使い慣れた構文を使用することを可能にするように指定すべきであるとし...

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

これは、C#usingステートメントと同じで、usingステートメントではありません。 –

+0

Touche '。私はその質問を誤解した。 – haliphax

24

(WMF5またはアップのWindows 10とに含まれる)のPowerShell 5.0は、言語に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構文である場合についてスクリプトの実行を防ぐことができますエラー)。

0
#Requires -Version 5 
using namespace System.Management.Automation.Host 
#using module 
関連する問題