C#调用PowerShell执行命令报错:CommandNotFoundException
C#调用PowerShell切换目录报错的解决方法
错误根源
你犯了两个关键错误:
AddCommand用法错误:AddCommand仅接受命令名称(比如Set-Location,cd是它的别名),不能把命令和参数拼接成字符串传入。PowerShell会把cd C:\...整个当作命令名,自然找不到对应的cmdlet,从而抛出CommandNotFoundException。- 命令链未清空:同一个
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
相关产品推荐
相关产品推荐

