Invoke-Expression : 无法将参数绑定到参数“Command”,因为该参数为空字符串。
如果不想看分析, 可以直接跳到解决部分.
问题的发现
在cursor中新建终端时,会发现这样的报错:

虽然报错不影响使用,但足够难受。
问题分析
红色部分是powershell的报错,我们根据报错定位到这个ps文件

可以看到,报错指的就是这个$activateCommand变量为空.
这个变量是一个命令执行的结果:
$activateCommand = (& $Env:CONDA_EXE $Env:_CE_M $Env:_CE_CONDA shell.powershell activate $Name | Out-String);
我先输出这个命令看看执行了什么, 添加一行:
Write-Host "$Env:CONDA_EXE $Env:_CE_M $Env:_CE_CONDA shell.powershell activate $Name";

输出:
C:\application\program\anaconda\Scripts\conda.exe shell.powershell activate base
为什么这个命令输出会是空呢? 我们在终端中运行试试:
中间的path部分我就打码了, 可以看到命令是正常的

但是cursor里面新建终端仍然有报错
我们查看cursor里面的完整报错, 在一开始的部分有python的报错:

这里显示, 在这个py文件中代码出错, gbk的编码方式不对
我们查看代码
def main_sourced(shell, *args, **kwargs):
"""Entrypoint for the "sourced" invocation of CLI interface. E.g. `conda activate`."""
shell = shell.replace("shell.", "", 1)
# This is called any way later in conda.activate, so no point in removing it
from ..base.context import context
context.__init__()
from ..activate import _build_activator_cls
try:
activator_cls = _build_activator_cls(shell)
except KeyError:
from ..exceptions import CondaError
raise CondaError(f"{shell} is not a supported shell.")
activator = activator_cls(args)
print(activator.execute(), end="")
return 0
解决方案
从直觉来看, 似乎只要换个编码就行. python里面字符串是以unicode存储的, 所以gbk出错应该是在print时.
所以我们修改python的输出流编码就行: 在报错的python文件的顶端加入:
import sys
import io
import os
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-16')
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding='utf-16')
这样与windows的默认编码一致
从cursor的报错中可以看出, cursor的终端环境是嵌套的conda, 因此我们要清除终端, 关闭重启cursor后再进行测试

运行正常了

解决后检查
尝试输出一下环境变量, 这里就看看path:
Write-Host $Env:path
检查发现是正确的

在vscode中新建终端, 也没有出错.

在自己的终端中没有报错, 手动输出环境变量也没有问题

尝试输入:
conda.exe shell.powershell activate base
发现有不正常的字符串:

可能是powershell显示的编码不同, 但是上面Write-Host是正常的, 所以这里只是显示问题了. 没有影响. 如果更改输出编码, 修复这里的显示问题, 那么conda激活的环节又可能出错了, 只能说鱼和熊掌不可兼得. 只要能正确激活环境就行.
至此, 问题解决. 要注意的是, conda更新版本之后, 需要检查一下这处修复是否需要重新弄.
杂谈
以下是杂谈, 问题的解决方案在上面.
我在搜索解决方案的时候, 总是搜到低质量的回答:

中文互联网特有的投屎.
还有一些五花八门的回答, 有说什么路径问题的(这个还好), 还有说什么直接把这段代码删掉的, 太匪夷所思了. 每个人的情况都可能不同, 但是最起码你所提供的方案要和你面临的报错相符吧? 我这个报错显示gbk编码错误, 那我就不会提供无关的方案.
如有其他问题可在下面评论.
