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



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

PS C:Usersdgupta> 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终端和普通终端是否可以访问相同的环境变量?

如果没有进一步的信息,就不可能诊断出您的问题,但这些故障排除提示可能有帮助:

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

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

从找到sam的PowerShell会话

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

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

    • 您需要确定辅助别名或函数是在哪里定义的,以及为什么您的其他会话看不到它,如果问题在新会话中重复出现,则必须连接到加载了配置文件(如自动$PROFILE变量中所反映的)

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

可能的原因:

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

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

    • 解决方案:

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

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

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

    • 解决方案:

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

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

  • 两者之一:即使persistentPath变量定义也缺少目录或兴趣的条目(即使安装程序通常会添加这样的条目)。

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

请参阅下一节。


将目录项添加到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.cpl,选择Advanced选项卡,然后单击Environment Variables...,然后根据需要修改Path变量。:

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

      • 以这种方式修改Path后,您需要以上述方式打开shell会话,以查看效果。

  • 编程

    • 有关帮助函数Add-Path,请参见此答案;答案还解释了为什么CCD_ 39应该而不是

诊断会话中加载了哪些配置文件

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

存在多个配置文件,所有(默认情况下)都是沿着两个独立的维度加载的:所有用户与当前用户,以及所有主机与当前主机(主机是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扩展附带的PIC(PowerShell集成控制台)中,确实加载了不同的配置文件,通过PowerShell: Enable Profile Loading设置启用IF-与常规控制台窗口相比[1]

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

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

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

  • 添加以下内容:

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

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

相关内容