【问题标题】:VS code terminal can't find AWS SAM even though windows terminal can即使 windows 终端可以,VS 代码终端也找不到 AWS SAM
【发布时间】:2022-01-25 10:13:04
【问题描述】:

我从 AWS for windows 的 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 终端和普通终端不能访问相同的环境变量吗?

【问题讨论】:

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

标签: powershell visual-studio-code aws-sam-cli


【解决方案1】:

如果没有更多信息,就不可能诊断出您的问题,但也许这些疑难解答提示会有所帮助:

如果您调用外部可执行文件 (sam),你的问题一定是可执行文件所在的目录未列在为当前进程定义的$env:PATH 环境变量中

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

从找到sam 的 PowerShell 会话中:

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

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

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

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

可能的原因:

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

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

    • 解决方案:

      • 启动一个会话,在您的情况下这意味着重新启动 Visual Studio Code,但请务必从开始菜单/任务栏/文件资源管理器启动它,因为他们知道修改后的环境。如有疑问,请注销并重新登录 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 主机环境的主机,例如常规控制台窗口或 Visual Studio Code 中的终端)。

automatic $PROFILE variable 报告当前用户、当前主机配置文件路径,但实际上具有列出 所有 路径的通常不可见的属性(您可以使用 $PROFILE | select * 使它们可见 - 请参阅 @ 987654325@)。

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

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

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

    • 您使用的是什么版本 PowerShell:Windows 自带的旧版Windows PowerShell 版本(其最新和最终 版本是5.1),其 CLI 为 powershell.exe,与按需安装的跨平台 PowerShell (Core) 版本相比,其 CLI 为 pwsh.exe,具有单独的配置文件位置。

    • 宿主环境的类型,反映在automatic $Host variable中。

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

[Environment]::CommandLine

注意:

  • Visual Studio Code 的 PowerShell 集成控制台中,您将始终在参数中看到-NoProfile,但配置文件可能仍会在启动期间加载,具体取决于PowerShell extension 的设置

由上可知,不同的宿主环境加载不同的profile文件集,在Visual Studio Code的PowerShell扩展提供的PowerShell集成控制台中,确实加载了不同的配置文件(如果通过设置启用加载) - 与常规控制台窗口相比[1]

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

  • 通过 Visual Studio Code 的设置,确保 PowerShell: Enable Profile Loading 设置已启用

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

  • 添加以下内容:

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

[1] 请注意,即使 没有 PowerShell 扩展,您也可以在 Visual Studio Code 终端中使用 PowerShell,并且此类会话 确实 使用与常规控制台窗口 - 请参阅 this answer

【讨论】:

    猜你喜欢
    • 2023-02-06
    • 2021-04-03
    • 2021-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2021-09-04
    相关资源
    最近更新 更多