VS 代码终端找不到 AWS SAM,即使 windows 终端可以

VS code terminal can't find AWS SAM even though windows terminal can

我从 AWS 的 msi 安装程序为 windows 安装了 AWS SAM。 在 运行 安装程序之后,我在 cmd 和 powershell 中 运行 sam --version

PS C:\Users\dgupta> sam --version
SAM CLI, version 1.26.0

它returns是我刚安装的版本。但是在 VS 代码中,我打开了一个终端并且 运行 sam --version 它出错了。

Windows PowerShell
Copyright (C) Microsoft Corporation. All rights reserved.
Try the new cross-platform PowerShell https://aka.ms/pscore6

sam : The term 'sam' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name,                                                                                                               g of the name,    
or if a path was included, verify that the path is correct and try again.
At line:1 char:1
+ sam --version
+ ~~~
    + CategoryInfo          : ObjectNotFound: (sam:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

为什么会这样? VS Code 终端和普通终端不能访问相同的环境变量吗?

如果没有更多信息就无法诊断您的问题,但也许这些故障排除技巧可以帮助您:

如果您仅通过姓名[=调用外部可执行文件 (sam) 216=], 你的问题一定是可执行文件所在的目录没有在为当前进程定义的 $env:PATH 环境变量中列出.

但是,可能外部 sam 可执行文件的目录 不在 $env:PATH 并且 sam 是同名 的辅助 PowerShell 命令,它知道 sam 的真实位置并在幕后调用它。 例如,可以定义 别名 - 例如 New-Alias sam 'C:\path\to\sam.exe' - 或 函数 - 例如 function sam { & C:\path\to\sam.exe $args }。 =56=]

sam 的 PowerShell 会话中找到:

  • 确定名称sam在您的会话中指的是什么类型的命令,请使用以下命令并检查CommandType列的值:
Get-Command sam
  • 如果命令类型是Application,你确实是在处理一个外部可执行文件Source 列将报告其完整路径,您可以从中收集可执行文件的目录[=217] =] 路径(您可以直接使用 Split-Path (Get-Command -Type Application sam).Path

    确定
    • 然后您需要诊断为什么那个目录 不是 $env:Path 中的另一个会话中 - 请参阅第一部分下面。
  • 如果命令类型不是Application:

    • 您需要确定辅助别名或函数的定义位置以及为什么您的其他会话看不到它,如果问题在新会话中重现,必须连接到 profile files (as reflected in the automatic $PROFILE variable) 已加载的内容

诊断目录从 $env:PATH 中丢失的原因:

可能的原因:

  • 您刚刚安装了一个可执行文件,安装程序修改了注册表中的永久$env:PATH定义

    • 任何 运行ning 进程在 before 此修改之前启动,甚至在修改之后启动,但 from 这样的进程看到修改。

    • 解法:

      • 启动一个会话,在你的情况下意味着重新启动Visual Studio代码,但是一定要从“开始”菜单/任务栏/文件资源管理器启动它,因为它们知道修改后的环境。如有疑问,请注销并重新登录到您的 Windows 会话,或重新启动您的计算机。

      • 或者,在会话中从注册表刷新 $env:PATH - 见下文。

  • 您当前的 PowerShell 会话中的某些内容(可能是无意中)从进程中的 $env:PATH 变量中删除了 sam 的目录。

    • 解法:

      • 使用以下命令从注册表刷新进程中的$env:PATH定义(注意任何先前的进程中修改都会丢失):
$env:PATH = [Environment]::GetEnvironmentVariable('Path', 'Machine') + ';' + [Environment]::GetEnvironmentVariable('Path', 'User')

如果这些解决方案没有帮助(持续),问题必须与 配置文件 加载到不同环境中有关 - 请参阅下一节。


诊断将哪些 配置文件 加载到会话中:

PowerShell 的 profile files(默认情况下)在会话启动时加载(点源)并允许自定义会话,其中可以包括自定义别名定义、函数,甚至进程中 $env:PATH 增加。

多个 个配置文件,全部 已加载(默认情况下),如果存在,沿着两个独立的维度:所有-用户与当前用户,以及所有主机与当前主机(主机是 PowerShell 主机环境,例如常规控制台 window 或 Visual Studio 代码中的终端)。

automatic $PROFILE variable reports the current-user, current-host profile-file path, but actually has normally invisible properties listing all paths (you can make them visible with $PROFILE | select * - see ).

将哪些配置文件加载到给定用户的会话中由以下因素决定:

  • 从根本上说,是否使用 CLI 的 -NoProfile 开关完全抑制 配置文件加载。

  • 如果被抑制(默认,即使有-Command-File调用):

    • 您使用的 PowerShell 版本:附带 Windows、旧版 Windows PowerShell 版本(其最新和 最终 版本为 5.1),其 CLI 为 powershell.exe, vs. the install-on-demand cross-platform PowerShell (Core) edition, whose CLI is pwsh.exe,具有 单独的 配置文件位置.

    • 主机环境的类型,反映在automatic $Host variable

查看用于调用当前会话的命令行,运行以下内容:

[Environment]::CommandLine

注:

  • Visual Studio Code you'll always see -NoProfile among the parameters, but the profiles may still be loaded during startup, depending on the settings of PowerShell extension
  • 中的 PowerShell 集成控制台中

由上可知,不同主机环境加载不同组的profile文件,在PowerShell Integrated ConsoleVisual Studio代码 的 PowerShell 扩展,不同 配置文件确实被加载(如果通过设置启用加载)- 与常规控制台相比windows[1]

如果您希望 PowerShell 集成控制台加载与常规控制台相同的当前用户配置文件 windows:

  • 通过 Visual Studio 代码的设置,确保 PowerShell: Enable Profile Loading 设置为 enabled.

  • 从 PowerShell 集成控制台,运行 psedit $PROFILE 打开主机特定的当前用户配置文件进行编辑。

  • 添加以下内容:

. ($PROFILE -replace '\.VSCode', '.PowerShell')

[1] 请注意,即使 没有 PowerShell 扩展,您也可以在 Visual Studio 代码终端中使用 PowerShell,这样的会话 do 使用与常规控制台相同的配置文件 windows - 参见 .