You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#调用PowerShell执行命令报错:CommandNotFoundException

C#调用PowerShell切换目录报错的解决方法

错误根源

你犯了两个关键错误:

  1. AddCommand用法错误:AddCommand仅接受命令名称(比如Set-Location,cd是它的别名),不能把命令和参数拼接成字符串传入。PowerShell会把cd C:\...整个当作命令名,自然找不到对应的cmdlet,从而抛出CommandNotFoundException。
  2. 命令链未清空:同一个PowerShell实例调用Invoke()后,必须用ClearCommands()清空之前的命令链,否则后续命令会追加到之前的执行序列里,导致逻辑混乱。

修正后的代码

using (PowerShell ps = PowerShell.Create())
{
    // 设置执行策略(仅当前进程生效,避免修改全局设置)
    ps.AddCommand("Set-ExecutionPolicy")
      .AddParameter("ExecutionPolicy", "Unrestricted")
      .AddParameter("Scope", "Process")
      .AddParameter("Force");
    ps.Invoke();
    ps.ClearCommands();

    // 切换到目标目录(推荐用Set-Location而非别名cd,更稳定)
    ps.AddCommand("Set-Location")
      .AddParameter("Path", @"C:\Users\User1\Documents\pathToFileforExecute\");
    ps.Invoke();
    ps.ClearCommands();

    // 执行目标文件
    ps.AddCommand("./executeTheFile");
    ps.Invoke();
    ps.ClearCommands();

    // 验证当前目录
    ps.AddCommand("pwd");
    Collection<System.Management.Automation.PSObject> results = ps.Invoke();

    // 输出验证结果
    foreach (var result in results)
    {
        Console.WriteLine(result.ToString());
    }
}

额外提示

  • 执行策略:用Scope=Process仅对当前PowerShell进程生效,无需修改系统全局设置,更安全。
  • 路径处理:用@符号包裹路径避免转义字符问题,或者直接用正斜杠/代替反斜杠。
  • 错误排查:每次Invoke()后检查ps.HadErrors,通过ps.Streams.Error获取详细错误信息,方便定位问题。

内容的提问来源于stack exchange,提问作者Sanberk Küçükeleşe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 20:50:26