我正在尝试为Visual Studio代码创建Visual Studio Developer Powershell配置文件。以下是我尝试的内容:
"Developer Powershell": {
"path": "pwsh",
"args": [
"-noe",
"-c",
"\"&{$vsPath = &(Join-Path ${env:ProgramFiles(x86)} '\\Microsoft Visual Studio\\Installer\\vswhere.exe') -property installationpath; Import-Module (Join-Path $vsPath 'Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll'); Enter-VsDevShell -VsInstallPath $vsPath -SkipAutomaticLocation}\""
],
"icon": "terminal-powershell"
}
我从我的Windows终端配置文件中复制并粘贴了这些参数,它可以工作:
{
"commandline": "pwsh.exe -noe -c \"&{$vsPath = &(Join-Path ${env:ProgramFiles(x86)} '\\Microsoft Visual Studio\\Installer\\vswhere.exe') -property installationpath; Import-Module (Join-Path $vsPath 'Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll'); Enter-VsDevShell -VsInstallPath $vsPath -SkipAutomaticLocation}\"",
"icon": "C:\\powershell\\713\\assets\\Square44x44Logo.png",
"name": "Developer PowerShell",
"startingDirectory": "%USERPROFILE%",
}
但是,终端输出如下所示:
&{ = &(Join-Path C:\Program Files (x86) '\Microsoft Visual Studio\Installer\vswhere.exe') -property installationpath; Import-Module (Join-Path 'Common7\Tools\Microsoft.VisualStudio.DevShell.dll'); Enter-VsDevShell -VsInstallPath -SkipAutomaticLocation}
StaggoSTD
- 注意:我在这里使用的是Oh My Posh。这就是为什么最后一行没有书呆子字体看起来很奇怪。*
那么我如何让Developer Powershell工作呢?我尝试使用powershell
而不是pwsh
,并删除转义的双引号,但没有任何效果。
3条答案
按热度按时间c0vxltue1#
我已经弄明白了。首先,我想给予mklement0,他提交了一个关于简化参数的答案,但是它被删除了。使用这个答案,我用
'C:\\Program Files (x86)'
替换了${env:ProgramFiles(x86)}
,一切都很顺利。为了检查是否一切都正常工作,我运行了gcm fsi
,它告诉我F# Interative在那里,即使它不在我的正常PATH
上。下面是我的个人资料,现在任何人谁想要开发人员Powershell在VSCode:至于为什么会有环境变量,我是从a Microsoft blog复制粘贴过来的。因为它适用于Windows终端,所以我以为它也适用于VSCode。然而,我在其他地方查找Developer Powershell配置文件时,都没有使用环境变量。后来,我发现我可以从
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2019\Visual Studio Tools
的快捷方式复制。uz75evzq2#
下面的代码-可用作
settings.json
文件的"terminal.integrated.profiles.windows"
属性内的属性,以定义名为Developer PowerShell
的 * 终端配置文件 *-修复了最初尝试中的问题。注:
"terminal.integrated.automationProfile.windows"
属性显式配置了一个 * 自动化 * shell用于 * 任务 * 和 * 调试 *-请参见Terminal Profiles。-Command <command>
附加到shell命令行(如果cmd.exe
是shell,则为/d /c <command>
)来传递它们,如果shell配置文件本身已经定义了 * 命令 *(而不仅仅是 * 选项 *)来在启动时执行,则会 * 中断 *。ProgramFiles(x86)
扩展为C:\Program Files (x86)
是非常安全的(尽管它 * 有 * 可能在配置不正常的系统上扩展为不同的路径),your own solution避免使用${env:ProgramFiles(x86)}
,通常应该可以正常工作。${env:ProgramFiles(x86)}
,并通过将其包含在一个嵌入式可扩展字符串(\"...\"
)中来使其工作,该字符串 * 直接 * 构造路径字符串,而不是通过Join-Path
。这不仅简化了命令,还避免了原来的问题之一:在(PowerShell)字符串文本 * 之外使用${env:ProgramFiles(x86)}
*;下一节将解释为什么这是一个问题。/
作为路径分隔符-PowerShell可以与\
互换-这不需要在 * JSON * 字符串中转义。"args"
属性将PowerShell CLI参数作为 * 数组 * 传递,因此 * 不 * 应将传递给-c
参数的字符串另外括在 * 嵌入、转义 *"..."
字符串中(\"...\"
),因为使用"args"
时,在将最终在后台调用的命令行缝合在一起时,是 * Visual Studio代码 * 执行任何必要的转义。\"...\"
中使用了enclosure,PowerShell最终会将您的命令视为单个expandable string literal,它的扩展值会隐式回显-这就是您看到的症状;简单地说,PowerShell最终执行了类似"$vsPath = ..."
的内容,该内容尝试扩展(插入)变量$vsPath
,由于不存在此类变量,因此它的计算结果为 * 空字符串 *,从而导致输出以下逐字字符串:= ...
"args"
,您不必担心在命令行中使用引号**:您只需 * 逐字 * 制定每个参数应该是什么,然后让VS Code执行转义**-然而,您 * 确实 * 需要执行与 * JSON * 相关的转义**,而且VS Code而不是PowerShell可能会 * 预先 * 扩展变量引用(如${env:ProgramFiles(x86)}
):"
作为\"
,\
作为\\
**;请注意,使用/
作为路径分隔符可以减轻后者的痛苦,PowerShell可以将/
与\
互换。${someName}
和${someNameSpace:someName}
**形式的引用作为预先扩展的候选对象,而不考虑$someName
和$someNameSpace:someName
$vsPath
或$env:USERNAME
)* 不 * 受潜在的预先扩展的影响,但如果由于 * 非标准名称 *(如${env:ProgramFiles(x86)}
),{...}
中的 shell 在PowerShell中在语法上是 * 必需的 *,则 * 可能 * 发生这种情况。env:
命名空间,特别是,前期扩展 * 总是 * 发生**(与command:
、config:
和input:
一样,但它们通常不在PowerShell中定义):VS代码将引用(如${env:ProgramFiles(x86)}
)扩展到该环境变量的 * verbatim value *。也就是说,在命令字符串中,${env:ProgramFiles(x86)}
在 * PowerShell看到该字符串之前 * 被替换为verbatimC:\Program Files (x86)
,并且该值前后 * 缺少引号 * 导致 * 语法错误 *。'${env:ProgramFiles(x86)}'
或\"${env:ProgramFiles(x86)}\"
。注意,这分别假定值本身不包含'
或"
;在无法做出此假设的情况下,请使用以下解决方法:(Get-Content 'env:ProgramFiles(x86)')
-c
(-Command
)的语句括在& { ... }
中,只需直接使用...
(语句)即可。& { ... }
是必需的,但这已经被纠正。0s0u357o3#
自定义PowerShell集成终端配置文件以与
Microsoft.VisualStudio.DevShell.dll
配合使用存在一些挑战:PowerShell.exe
,而是pwsh.exe
)。settings.json
中使用"terminal.integrated.automationProfile.windows"
时会注入-Command
。因此,不要使用它。相反...Microsoft.VisualStudio.DevShell.dll
配置Visual Studio代码的任务。有点痛苦,但在"terminal.integrated.automationProfile.windows"
按预期工作之前必须这样做。配置集成终端配置文件:
为特定任务配置
Microsoft.VisualStudio.DevShell.dll
: