Эквивалентно тому, что C # использует ключевое слово в powershell?

Когда я использую другой объект в .net-Framework в C #, я могу сэкономить много текста, используя директиву using.

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

...


  var blurb = new Thingamabob();

...
</code>

Так есть ли в Powershell способ сделать что-то похожее? Я получаю доступ ко многим объектам .net и не рад тому, что мне нужно набрать

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

все время.

 TheIncorrigible110 мая 2018 г., 11:44
Я знаю, что это старый вопрос, но PowerShell 5 представилusing заявление. Вы можете использовать это для пространств имен .net или модулей (это один из немногих способов импорта пользовательских классов). Синтаксисusing namespace Name.Space.Here или жеusing module C:\Path\to\manifest, Единственное требование состоит в том, чтобы он предшествовал любым другим операторам в вашем скрипте (даже блоку param)

Ответы на вопрос(9)

рисваиваю часто используемые типы переменным, а затем создаю их экземпляры:

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

Возможно, оно того не стоит, если тип не будет использоваться повторно, но я считаю, что это лучшее, что вы можете сделать.

 24 мар. 2016 г., 18:55
Иногда мне нужно преобразовать SecureStrings обратно в обычный текст. Полезно следующее:$ns = [System.Runtime.InteropServices.Marshal] тогда ты можешь$ns::PtrToStringAuto($ns::SecureStringToBSTR($ss)).
 04 февр. 2017 г., 16:12
Примечание для тех, кто ищет ответ с самым высоким рейтингом: PowerShell 5.0 исправляет это.
Решение Вопроса

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

 11 февр. 2016 г., 09:58
Кажется, что нужно использовать имя сборки (например, mscorlib) вместо имени типа (например, System.IO.Path).
 11 февр. 2016 г., 09:59
Если у вас нет объекта, чтобы передать его функции, вы можете создать его, используяNew-Object PSObject.

$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
 01 окт. 2015 г., 12:04
Это будет эквивалентно оператору C # using, а не директиве using.
 04 дек. 2015 г., 19:43
Мне нравится, как это выглядит. Если бы вы взяли на себя обязательство, это кажется мне довольно элегантным решением. Гибкость PowerShell при создании нового синтаксиса меня очень радует.
 18 янв. 2016 г., 22:25
@ProgrammerPaul Если вы находите это забавным, попробуйте функциональный язык - некоторые из них реализуютtry..catch какlibrary, включая Haskell и IIRC Clojure.
 12 июн. 2015 г., 18:54
Может ли кто-нибудь объяснить двойной `` 1 в типе, который мне трудно найти?
 06 апр. 2018 г., 03:00
@ProgrammerPaul (по сравнению с функциональными языками), лол, просто читал это, оборачивая F # lib (DSL Parser через FParsec). Я знаю / люблю Haskell, Clojure, Scala и до сих пор не могу удержать комментарий. Вот оно: Возможно, попробуйте какой-нибудь действительно объектно-ориентированный язык, например Smalltalk - он реализует If / Else как библиотеку ;-)))

вы можете сохранить имя длинного пространства имен в строке:

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

Он не такой мощный, какusing директива на C #, но по крайней мере она очень проста в использовании.

который работает в 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)
            }
        }

    }

}
 17 нояб. 2009 г., 03:49
Это удобно, но используйте его с осторожностью. Ничего хуже, чем написание сценария, который не работает на чужой машине. По этой причине я никогда не помещал эти ускорители в свой профиль. Во всяком случае, я помещу их в верхнюю часть скрипта таким образом, чтобы он сразу же потерпел неудачу в Add-TypeAccelerator.
 froh4215 нояб. 2009 г., 22:49
Джош, спасибо, я еще не смотрел на расширение типов ускорителей. Это очень интересно, я думаю, я немного поиграюсь с этим.

вета, потому что он наиболее близко напоминает то, что я ищу.

Все ваши ответы привели меня на трек, который кажется наиболее перспективным:его сообщение в блоге Кит Дальби предлагает командлет 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-тип будет включать в себя шаг для разрешения любого заданного типа по пути.

что это старый пост, но я искал то же самое и наткнулся на это:http://weblogs.asp.net/adweigert/powershell-adding-the-using-statement

Изменить: я полагаю, я должен указать, что он позволяет использовать знакомый синтаксис ...

using ($x = $y) { ... }
 01 окт. 2015 г., 12:05
Это будет эквивалентно оператору C # using, а не директиве using.
 05 окт. 2015 г., 16:41
Туш & APOS ;. Я неправильно понял вопрос.

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 это синтаксическая ошибка.)

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

Ваш ответ на вопрос