我从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')
如果这些解决方案(持续)没有帮助,问题一定是:
两者之一:即使persistent
Path
变量定义也缺少目录或兴趣的条目(即使安装程序通常会添加这样的条目)。或者:问题产生于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,并且此类会话使用与常规控制台窗口相同的配置文件-请参阅此答案