提问人:Dhruv 提问时间:7/16/2021 最后编辑:mklement0Dhruv 更新时间:6/29/2023 访问量:5422
VS Code 终端找不到 AWS SAM,即使 Windows 终端可以找到
VS code terminal can't find AWS SAM even though windows terminal can
问:
我从适用于 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 终端和普通终端不能访问相同的环境变量吗?
答:
如果没有更多信息,就不可能诊断您的问题,但也许这些故障排除提示会有所帮助:
如果仅按名称调用外部可执行文件 (sam
),则问题必须是可执行文件所在的目录未在为当前进程定义的 $env:PATH
环境变量中列出。
但是,外部 sam
可执行文件的目录可能不在 $env:PATH
中,并且 sam
是同名的辅助 PowerShell 命令,它知道 true 的位置并在后台调用它。
例如,可以定义别名(例如)或函数(例如)。sam
New-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.cpl
Advanced
Environment Variables...
Path
注意:要修改 下的变量,即变量的系统范围部分,您需要是管理员。
Path
System variables
Path
以这种方式修改后,您需要以上述方式打开一个新的 shell 会话才能看到效果。
Path
以编程方式:
- 有关辅助函数,请参阅此答案;答案还解释了为什么不应该使用。
Add-Path
set.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,并且此类会话确实使用与常规控制台窗口相同的配置文件 - 请参阅此答案。
评论