如何将不同的Powershell宏合并为一个?

时间:2018-12-17 10:32:55

标签: powershell

由于.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 :(得分:5)

您想要的是什么

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()]使函数像已编译的cmdlet一样工作。 => MS Docs

[Alias()]允许您在函数内部定义别名。 => MS Docs

ValueFromRemainingArguments根据不是-AsAdmin的所有参数组成一个数组。 => MS Docs

@parameters被称为“ splatting”。 => MS Docs