由于.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
一切正常,但并不如我所愿。也许我想得太多了,但是我想知道是否有一种方法可以创建更好的函数,并通过传递不同的参数来使用这两个别名。
谢谢!
答案 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