最近的agent coding可畏是如日中天的火,而不久前vscode中镶嵌的智能体就推出agent模式;作为使用github copilot学生的我,也是使用很多次,我觉得agent模式比起普通的编程,就是一句话让它自己跑,最后展示成果给你,而普通的ai就是你一句我一句的轮流输出。

        在此过程中,agent会调用终端自己判断结果是否正确,然后给你反馈。问题来了,它每次都是调用Powershell,而我的vscode默认终端是CMD,所以每次都报“终端进程“C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe '/K', 'chcp 65001'”已终止,退出代码: 1”;

这样就很苦恼,agent不能完全确定它做的是否和预期一样。

1. 问题解决过程

询问gemini,对于“终端进程“C:\WINDOWS\System32\WindowsPowerShell\v1.0\powershell.exe '/K', 'chcp 65001'”已终止,退出代码: 1。”这句话,它说,

  • /KCMD (命令提示符) 的参数,意思是“执行命令并保留窗口”。

  • PowerShell 根本不认识 /K(PowerShell 对应的参数应该是 -NoExit -Command

这说明用 PowerShell 的程序路径去跑了 CMD 的启动逻辑。这可能是因为我之前安装 Anaconda 时,脚本为了解决中文乱码(chcp 65001)强行修改了你的终端启动参数,但现在路径乱了。

gemini给出的解决方法:

方法 A:重置终端配置文件(最推荐)
  1. 按下 Ctrl + Shift + P,输入并选择 Preferences: Open User Settings (JSON)

  2. 在 JSON 文件中,搜索 terminal.integrated.profiles.windows

  3. 看看 PowerShell 这一项下面是不是有 "args": ["/K", "chcp 65001"]

  4. 删掉整个 args 部分,或者将其改为正确的 PowerShell 格式:

    "PowerShell": {
        "source": "PowerShell",
        "args": ["-NoExit", "-Command", "chcp 65001"] 
    }
    

    或者干脆删除自定义的 PowerShell Profile,让 VS Code 使用内置默认值。

方法 B:切换到纯正的 CMD

既然报错是因为参数混淆,切换到 CMD 通常能自动匹配正确的 /K 参数。

  1. 点击终端面板右上角的 + 号下拉箭头。

  2. 选择 Select Default Profile

  3. 选择 Command Prompt

  4. 彻底关闭 VS Code 再重启。

按照它所说方案a无效;而方案二它让我切换到CMD,结合我之前问它的,我意识到,agent运行shell是通过Powershell的方式,而我的terminal默认就是CMD,这2个终端是不通用的!我想这大概就是每次它调用terminal都不成功都报错的原因。

而为什么用CMD不用Powershell呢?方案二我本身默认terminal就是cmd呀,应该这个方案就是不行的。默认设置如下图所示:(方案1的第一步调出来的json文件)

既然ai agent是一直使用Powershell调用终端,那换成Powershell试试呢?

最终agent成功调用Powershell终端,我的agent终于变得好用起来。

2. 探讨CMD 与 PowerShell 的“前世今生”

之前说到的cmd和Powershell的区别,我在想换成Powershell会不会有什么坏处?或者说对比cmd有什么缺失?翻读科普后,我的担心土崩瓦解。

 一、 历史的背影:CMD 是如何诞生的?

要讲 CMD,我们得把时钟拨回到 20 世纪 80 年代。

那时候还没有漂亮的图标和鼠标点击,大家操作电脑全靠打字。微软最初的操作系统叫 MS-DOS。随着 Windows 的崛起,微软为了让用户能继续运行那些老旧的 DOS 软件,就在 Windows NT 系统里内置了一个模拟器,这就是我们今天看到的 Command Prompt (CMD)

  • 它的角色: 翻译官。它把你的命令翻译给系统听。

  • 它的局限: 它的思维非常“线性”,只能处理简单的文本输入和输出。

二、 时代的呼唤:为什么需要 PowerShell?

到了 2000 年左右,微软发现了一个尴尬的问题:随着电脑系统越来越复杂,CMD 已经“带不动”了。当时的系统管理员想要批量管理成百上千台服务器,CMD 那点微弱的脚本能力简直是杯水车薪。于是,大神 Jeffrey Snover 提出了一个革命性的想法,并在 2006 年发布了 PowerShell。PowerShell 不仅仅是一个命令行,它是一个完整的自动化框架。它的出现不是为了取代 CMD 玩玩小命令,而是为了让开发者能像搭积木一样控制整个操作系统。

三、 核心区别:不仅仅是颜色的不同

特性PowerShell (PS)Command Prompt (CMD)
功能强度极强。支持对象流、复杂的脚本逻辑和现代指令。。仅支持基础的批处理指令。
Conda 兼容性。Miniconda 默认支持 PS,激活环境后会有 (base) 提示。极好。老牌兼容,路径处理最简单。
路径处理严格。路径中有空格或特殊字符需用引号或 & 符号。宽松。对 Windows 路径适配最直观。
启动速度稍慢。因为要加载大量的 .NET 运行库和 Profile 脚本。极快。秒开。
报错风险较高。由于语法严格,Agent 或插件传参错误容易导致退出代码 1。。逻辑简单,不容易因为参数报错。

因此,Powershell比cmd更加现代化,更加好用,ls等命令行更好记,也不难理解agent每次都是调用Powershell而不是cmd,很感谢gemini启发了我如何解决问题。所以换成Powershell 100%是个正确的决定。

好了本期就聊到这里,我们下期再见!

Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐