代码之家  ›  专栏  ›  技术社区  ›  Kralizek

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

  •  3
  • Kralizek  · 技术社区  · 6 年前

    自从.NET内核出现以来,我一直在使用越来越多的命令行作为工作方式,通常我使用的是大量的PowerShell。

    虽然Visual Studio代码对命令行非常友好,但它的大哥却不能这么说。

    为了改善这种情况,我在$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 回复  |  直到 6 年前
        1
  •  5
  •   marsze    6 年前

    你想要的是:

    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 称为“喷溅”。 => MS Docs