Как объединить разные макросы Powershell в один? - PullRequest
0 голосов
/ 17 декабря 2018

С тех пор, как вышел .NET Core, я все больше и больше использую командную строку и в целом использую PowerShell.

Хотя Visual Studio Code очень удобен для командной строки, нельзя сказать то же самое для его старшего брата.

Чтобы улучшить ситуацию, я добавил следующее в свой файл $ PROFILE.

function Execute-VisualStudioAsAdmin
{
    if ($args.Count -gt 0)
    {
        Start-Process "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\devenv.exe" $args -Verb RunAs
    }
    else
    {
        Start-Process "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\devenv.exe" -Verb RunAs
    }
}

Set-Alias vsa Execute-VisualStudioAsAdmin -Option ReadOnly

Set-Alias vs "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\devenv.exe" -Option ReadOnly

Теперь я могу сделать

PS> vs

PS> vsa

PS> vs .\Solution.sln

PS> vsa .\Solution.sln

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

Заранее спасибо!

1 Ответ

0 голосов
/ 17 декабря 2018

То, что вы хотите, это:

function Start-VisualStudio {
    [CmdletBinding()]
    [Alias("vs")]
    param(
        [Parameter()]
        [switch]$AsAdmin,
        [Parameter(
            Mandatory = $false,
            ValueFromRemainingArguments = $true
        )]
        [string[]]$ArgumentList
    )
    process {
        $parameters = @{
            FilePath = "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\devenv.exe"
        } 
        if ($AsAdmin.ToBool()) {
            $parameters["Verb"] = "RunAs"
        }
        # Allow no null or empty arrays or values
        $ArgumentList  = @($ArgumentList | where {"$_" -ne ""})
        if ($ArgumentList.Count -gt 0) {
            $parameters["ArgumentList"] = $ArgumentList 
        }
        Start-Process @parameters
    }
}

Примеры:

vs
vs .\Solution.sln
vs .\Solution.sln -AsAdmin

Пояснения:

[CmdletBinding()] заставляет функцию работать как скомпилированный командлет. => MS Docs

[Alias()] позволяет определить псевдоним внутри функции. => MS Docs

ValueFromRemainingArguments создает массив из всех аргументов, которые не являются -AsAdmin. => MS Docs

@parameters называется «брызги». => MS Docs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...