VS Code 终端找不到 AWS SAM,即使 Windows 终端可以找到

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

提问人:Dhruv 提问时间:7/16/2021 最后编辑:mklement0Dhruv 更新时间:6/29/2023 访问量:5422

问:

我从适用于 Windows 的 AWS 的 msi 安装程序安装了 AWS SAM。 运行安装程序后,我在 cmd 和 powershell 中运行。sam --version

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

它返回我刚刚安装的版本。但是在 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 终端和普通终端不能访问相同的环境变量吗?

PowerShell visual-studio代码 aws-sam-cli 路径变量

评论

1赞 Dhruv 7/20/2021
我不确定究竟是什么修复了它,我认为它与docker有关。找不到 sam 命令。所以我删除并重新安装了 docker。在 path 变量中编辑了 python.exe 的路径。重新安装了SAM,我没有重新启动计算机,而是将其关闭并在没有Windows更新的情况下启动它。

答:

7赞 mklement0 7/17/2021 #1

如果没有更多信息,就不可能诊断您的问题,但也许这些故障排除提示会有所帮助:

如果仅按名称调用外部可执行文件 (sam),则问题必须是可执行文件所在的目录未在为当前进程定义的 $env:PATH 环境变量中列出

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

在找到的 PowerShell 会话中:From the PowerShell session where is found:sam

  • 若要确定名称 sam 在会话中引用的命令类型,请使用以下命令并检查列的值:CommandType
Get-Command sam
  • 如果命令类型为 Application,则您确实在处理外部可执行文件,并且 Source 列将报告其完整路径,您可以从中收集可执行文件的目录路径(您可以直接使用Split-Path (Get-Command -Type Application sam).Path

    • 然后,您需要诊断该目录为什么不在另一个会话的 $env:Path - 请参阅下面的第一部分。
  • 如果命令类型不是“应用程序”:

    • 您需要确定辅助别名或函数的定义位置以及其他会话看不到它的原因,如果问题在新会话中可重现,则必须将其连接到加载的配置文件(反映在自动$PROFILE变量中)。

诊断 $env:PATH 中缺少目录的原因:

可能的原因:

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

    • 在此修改之前启动的任何正在运行的进程,甚至是之后直接从此类进程启动的进程,即作为子进程,都看不到修改。

    • 溶液:

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

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

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

    • 溶液:

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

如果这些解决方案(持续)没有帮助,问题一定是:

  • 任一:即使是持久变量定义也缺少目录或兴趣的条目(即使安装程序通常会添加这样的条目)。Path

  • 或者:问题源于将哪些 PowerShell 配置文件加载到不同的环境中。
    例如,如果给定的配置文件将相关条目动态添加到每个会话,则不同的环境(如 Visual Studio Code)可能不会加载相同的配置文件。
    $env:PATH

请参阅下一节。


自行将目录条目添加到 Path 环境变量的持久定义中:

  • 如果不知道要添加到 Path 变量的目录,可以通过如下命令找到它:

    # Find the directory/ies on drive C: that contain a "sam.exe" file.
    Get-ChildItem C:\ -Filter sam.exe -Recurse -File -ErrorAction Ignore | 
      ForEach-Object DirectoryName
    
  • 以交互方式

    • 运行 ,选择选项卡,然后单击 ,然后根据需要修改变量。sysdm.cplAdvancedEnvironment Variables...Path

      • 注意:要修改 下的变量,即变量的系统范围部分,您需要是管理员PathSystem variablesPath

      • 以这种方式修改后,您需要以上述方式打开一个新的 shell 会话才能看到效果。Path

  • 以编程方式

    • 有关辅助函数,请参阅此答案;答案还解释了为什么不应该使用Add-Pathset.exe

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

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

多个配置文件,默认情况下,所有这些配置文件都沿两个独立维度加载(如果存在):all-users vs. current-user 和 all-hosts vs. current-host(主机是 PowerShell 主机环境,例如常规控制台窗口或 Visual Studio Code 中的终端)。

自动$PROFILE变量报告当前用户、当前主机配置文件路径,但实际上具有列出所有路径的通常不可见的属性(您可以使用以下命令使它们可见 - 请参阅此答案)。$PROFILE | select *

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

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

  • 如果禁止(默认值,即使使用 和 调用):-Command-File

    • 您正在使用的 PowerShell 版本:随附 Windows 的旧版 Windows PowerShell 版本(其最新和最终版本为 5.1),其 CLI 为 powershell.exe,而按需安装的跨平台 PowerShell (Core版本(其 CLI 为 pwsh.exe)具有单独的配置文件位置。

    • 主机环境的类型,反映在自动$Host变量中。

若要查看用于调用当前会话的命令行,请运行以下命令:

[Environment]::CommandLine

注意:

  • 在 PIC(PowerShell 集成控制台)(在 Visual Studio Code 的集成终端中运行)中,你将始终看到参数,但配置文件可能仍会在启动期间加载 - 见下文。-NoProfile

综上所述,不同的主机环境加载不同的配置文件集,并且在 PowerShell 扩展附带并在 Visual Studio Code 的集成终端中运行的 PIC(PowerShell 集成控制台)中,与常规控制台窗口相比,确实加载了不同的配置文件,如果通过设置启用 - [1]PowerShell: Enable Profile Loading

如果希望 PIC 会话加载与常规控制台窗口相同的当前用户配置文件:

  • 通过 Visual Studio Code 的设置,首先确保已启用该设置,并在必要时启动新的 PIC 会话。PowerShell: Enable Profile Loading

  • 在 PIC 会话中,运行以打开特定于主机的当前用户配置文件进行编辑。psedit $PROFILE

  • 添加以下内容:

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

[1] 请注意,即使没有 PowerShell 扩展,也可以在 Visual Studio Code 终端中使用 PowerShell,作为通用 shell,并且此类会话确实使用与常规控制台窗口相同的配置文件 - 请参阅此答案

评论

0赞 mutex 9/8/2023
我正在尝试按照“如果您希望您的 PIC 会话加载与常规控制台窗口相同的当前用户配置文件:”的说明进行操作:“ - 但是如果我添加内容以替换配置文件,它似乎只会使我的新 PIC 会话处于不可用的状态并挂起而不会在命令提示符下结束。
1赞 mklement0 9/8/2023
@mutex,我鼓励你提出一个专注于你的具体问题的新问题。