سؤال

عندما أستخدم كائنًا آخر في .NET-Framework في C# يمكنني حفظ الكثير من الكتابة باستخدام التوجيه باستخدام.

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;

طوال الوقت.

هل كانت مفيدة؟

المحلول

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 هو خطأ في بناء الجملة.)

نصائح أخرى

لا يوجد شيء على مستوى مساحة الاسم من هذا القبيل. غالبًا ما أقوم بتعيين أنواع شائعة الاستخدام للمتغيرات ثم إنشاء مثيل لها:

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

ربما لا يستحق ذلك إذا لم يتم استخدام النوع بشكل متكرر ، لكنني أعتقد أنه أفضل ما يمكنك فعله.

تحقق من منشور المدونة هذا منذ عامين: http://blogs.msdn.com/richardb/archive/2007/02/21/add-types-ps1-poor-man-s-us-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)

في الأساس ما أقوم به هو زحف التجميع لأنواع غير تافهة ، ثم اكتب "مُنشئًا" يستخدم إضافة عضو في إضافة (بطريقة منظمة) إلى الكائنات التي أهتم بها.

انظر أيضًا هذا المنشور المتابعة: http://richardberg.net/blog/؟p=38

هذه مجرد مزحة ، نكتة ...

$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#، ولكن على الأقل من السهل جدًا استخدامه.

شكرا جميعا على مداخلتكم. لقد حددت مساهمة ريتشارد بيرج كإجابة ، لأنها تشبه إلى حد كبير ما أبحث عنه.

جلبتني جميع إجاباتك على المسار الذي يبدو أكثر واعدة: في منشور مدونته يقترح Keith Dahlby قائماً من النوع الذي يتيح تدوينًا سهلاً لأنواع للطرق العامة.

أعتقد أنه لا يوجد سبب ضد التنفيس من هذا للبحث أيضًا من خلال مسار محدد مسبقًا من التجميعات لنوع ما.

إخلاء المسئولية: لم أقم ببناء ذلك - بعد ...

إليكم كيف يمكن للمرء استخدامه:

$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-TYPE الممتدة خطوة لحل أي نوع معين مرة أخرى في المسار.

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

أدرك أن هذا منشور قديم ، لكنني كنت أبحث عن نفس الشيء وصادف هذا: http://weblogs.asp.net/adweigert/powershell-adding-the-using-statement

تحرير: أفترض أنني يجب أن أحدد أنه يتيح لك استخدام بناء الجملة المألوف لـ ...

using ($x = $y) { ... }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top