programing

powershell에서 C#의 "using" 키워드와 동등합니까?

stoneblock 2023. 4. 9. 21:03

powershell에서 C#의 "using" 키워드와 동등합니까?

C#의 .net-Framework에서 다른 개체를 사용하는 경우 using 디렉티브를 사용하면 많은 입력을 절약할 수 있습니다.

using FooCompany.Bar.Qux.Assembly.With.Ridiculous.Long.Namespace.I.Really.Mean.It;

...


  var blurb = new Thingamabob();

...

파워셸에서 비슷한 일을 할 수 있는 방법이 있을까요?많은 .net 오브젝트에 접속하고 있어 입력하지 않아도 됩니다.

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

항상요.

네임스페이스 수준에는 그런 것이 없습니다.자주 사용하는 유형을 변수에 할당하고 인스턴스화합니다.

$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 이상에 포함)은 언어에 구성을 추가합니다.스크립트에서 다음과 같이 사용할 수 있습니다.

#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는 구문 오류입니다.)

몇 년 전 블로그 투고를 확인해 주세요.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)

기본적으로 중요한 유형의 어셈블리를 탐색한 다음 구성원을 사용하여 관심 개체에 추가하는 "구성자"를 작성합니다.

다음 후속 게시물도 참조하십시오. 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"

파워가 너무 약해서usingC#의 지시문이지만, 적어도 매우 사용하기 쉽습니다.

여러분의 조언에 감사드립니다.리처드 버그의 공헌을 답으로 표시해 두었습니다.왜냐하면 제가 찾고 있는 것과 가장 비슷하기 때문입니다.

당신의 모든 답변이 저를 가장 유망해 보이는 궤도에 올려놓았습니다.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 의 범용 리스트가 표시됩니다.물론 경로 정의에 관한 모든 것을 다른 유틸리티 함수로 정리할 것입니다.확장 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) { ... }

언급URL : https://stackoverflow.com/questions/1048954/equivalent-to-cs-using-keyword-in-powershell