如何让Visual Studio Developer Powershell在Visual Studio Code的集成终端中工作?

ktecyv1j  于 2023-03-02  发布在  Shell
关注(0)|答案(3)|浏览(238)

我正在尝试为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,并删除转义的双引号,但没有任何效果。

c0vxltue

c0vxltue1#

我已经弄明白了。首先,我想给予mklement0,他提交了一个关于简化参数的答案,但是它被删除了。使用这个答案,我用'C:\\Program Files (x86)'替换了${env:ProgramFiles(x86)},一切都很顺利。为了检查是否一切都正常工作,我运行了gcm fsi,它告诉我F# Interative在那里,即使它不在我的正常PATH上。下面是我的个人资料,现在任何人谁想要开发人员Powershell在VSCode:

"Developer Powershell": {
    "path": "pwsh",
    "args": [
        "-noe",
        "-c",
        "$vsPath = &(Join-Path 'C:\\Program Files (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"
}

至于为什么会有环境变量,我是从a Microsoft blog复制粘贴过来的。因为它适用于Windows终端,所以我以为它也适用于VSCode。然而,我在其他地方查找Developer Powershell配置文件时,都没有使用环境变量。后来,我发现我可以从C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Visual Studio 2019\Visual Studio Tools的快捷方式复制。

uz75evzq

uz75evzq2#

    • TL;医生**

下面的代码-可用作settings.json文件的"terminal.integrated.profiles.windows"属性内的属性,以定义名为Developer PowerShell的 * 终端配置文件 *-修复了最初尝试中的问题。

"Developer Powershell": {
  "path": "pwsh",
  "args": [
    "-noexit",
    "-c",
    "$vsPath = & \"${env:ProgramFiles(x86)}/Microsoft Visual Studio/Installer/vswhere.exe\" -property installationpath; Import-Module \"$vsPath/Common7/Tools/Microsoft.VisualStudio.DevShell.dll\"; Enter-VsDevShell -VsInstallPath $vsPath -SkipAutomaticLocation"
  ],
  "icon": "terminal-powershell"
}

注:

    • 不要 * 将此shell配置文件用作 * 默认 * 配置文件-* 除非 * 您还通过"terminal.integrated.automationProfile.windows"属性显式配置了一个 * 自动化 * shell用于 * 任务 * 和 * 调试 *-请参见Terminal Profiles
  • 问题是自动化操作传递 * 额外的 * 命令来执行,Visual Studio Code通过 * 盲目地将 * -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)}):
      • JSON转义**:嵌入式逃生门**"作为\"\作为\\**;请注意,使用/作为路径分隔符可以减轻后者的痛苦,PowerShell可以将/\互换。
      • VS代码前期可变扩展陷阱**:
  • VS代码仅考虑将**${someName}${someNameSpace:someName}**形式的引用作为预先扩展的候选对象,而不考虑$someName$someNameSpace:someName
  • 因此,典型的PowerShell变量引用(如$vsPath$env:USERNAME)* 不 * 受潜在的预先扩展的影响,但如果由于 * 非标准名称 *(如${env:ProgramFiles(x86)}),{...}中的 shell 在PowerShell中在语法上是 * 必需的 *,则 * 可能 * 发生这种情况。
      • 对于env:命名空间,特别是,前期扩展 * 总是 * 发生**(与command:config:input:一样,但它们通常不在PowerShell中定义):VS代码将引用(如${env:ProgramFiles(x86)})扩展到该环境变量的 * verbatim value *。也就是说,在命令字符串中,${env:ProgramFiles(x86)}在 * PowerShell看到该字符串之前 * 被替换为verbatim C:\Program Files (x86),并且该值前后 * 缺少引号 * 导致 * 语法错误 *。
  • 虽然这种预先扩展不能被 * 抑制 *,一个简单的解决方案是将引用 * 括在引号 * 中:'${env:ProgramFiles(x86)}'\"${env:ProgramFiles(x86)}\"。注意,这分别假定值本身不包含'";在无法做出此假设的情况下,请使用以下解决方法:

(Get-Content 'env:ProgramFiles(x86)')

  • 顺便说一句:没有必要将传递给-c-Command)的语句括在& { ... }中,只需直接使用...(语句)即可。
  • 旧版本的CLI documentation错误地建议& { ... }是必需的,但这已经被纠正。
0s0u357o

0s0u357o3#

自定义PowerShell集成终端配置文件以与Microsoft.VisualStudio.DevShell.dll配合使用存在一些挑战:

  • 使用最新版本的PowerShell(不是PowerShell.exe,而是pwsh.exe)。
  • Visual Studio代码中存在一个“缺陷”,在settings.json中使用"terminal.integrated.automationProfile.windows"时会注入-Command。因此,不要使用它。相反...
  • 直接用Microsoft.VisualStudio.DevShell.dll配置Visual Studio代码的任务。有点痛苦,但在"terminal.integrated.automationProfile.windows"按预期工作之前必须这样做。
    配置集成终端配置文件:
"terminal.integrated.defaultProfile.windows": "Developer PowerShell",
    "terminal.integrated.shellIntegration.enabled": false,
    "terminal.integrated.shellIntegration.decorationsEnabled": "both",
    "terminal.integrated.profiles.windows": {

    "PowerShell": {
        "source": "PowerShell",
        "icon": "terminal-powershell"
    },
    "Command Prompt": {
        "path": [
            "${env:windir}\\Sysnative\\cmd.exe",
            "${env:windir}\\System32\\cmd.exe"
        ],
        "args": [],
        "icon": "terminal-cmd"
    },
    "Git Bash": {
        "source": "Git Bash"
    },
    "Developer PowerShell": {
        "path": "C:\\Program Files\\PowerShell\\7\\pwsh.exe",
        "icon": "terminal-powershell",
        "args": [
            "-noexit",
            "-Command",
            "Import-Module 'C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/Common7/Tools/Microsoft.VisualStudio.DevShell.dll'; Enter-VsDevShell -VsInstallPath 'C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools' -SkipAutomaticLocation;"
        ]
        
    }

为特定任务配置Microsoft.VisualStudio.DevShell.dll

{
    "version": "2.0.0",
    "tasks": [

 {
            "type": "shell",
            "label": "MyApp.API - Debug",
            "detail": "Clean and Precompile API.",
            "dependsOn": "MyApp.API - Clean",
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "presentation": {
                "clear": false,
                "echo": true,
                "panel": "shared"
            },
            "problemMatcher": [
                "$msCompile"
            ],
            "options": {
                "shell": {
                    "executable": "C:\\Program Files\\PowerShell\\7\\pwsh.exe",
                    "args": [
                        "-NoProfile",
                        "-ExecutionPolicy",
                        "Bypass",
                        "-Command",
                        "Import-Module 'C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/Common7/Tools/Microsoft.VisualStudio.DevShell.dll'; Enter-VsDevShell -VsInstallPath 'C:/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools' -SkipAutomaticLocation;"
                    ]
                }
            },
            "command": "cl.exe",
            "args": [
                "/c",
                "/std:c++20",
                "/permissive-",
                "/await",
                "/bigobj",
                "/utf-8",
                "/MTd",
                "/sdl",
                "/Gr",
                "/GL",
                "/Zo",
                "/Z7",
                "/EHsc",
                "/FC",
                "/Fd:",
                "Build/Debug/pch.pdb",
                "/Fo:",
                "Build/Debug/",
                "Include/pch.cpp",
                "/Ycpch.h",
                "/FpBuild/Debug/pch.pch"
            ]
        }
    ]
}
}

相关问题