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

通过C#调用CMD执行PowerShell命令报错的解决咨询

解决C#调用CMD脚本找不到Set-ProcessMitigation的问题

问题原因

双击CMD文件时,Windows 10 64位系统默认启动64位CMD,对应调用64位PowerShell,而Set-ProcessMitigation是64位系统专属的PowerShell cmdlet。但如果你的C#程序编译为Any CPU且勾选了默认的Prefer 32-bit选项,会以32位进程运行,调用的是32位CMD和32位PowerShell,32位环境中不存在该cmdlet,因此触发错误。

解决方案

方案1:修改C#项目编译设置

  • 右键项目 → 属性 → 生成 → 取消勾选Prefer 32-bit
  • 将目标平台设置为x64,确保程序以64位进程运行

方案2:修改CMD脚本,强制调用64位PowerShell

直接在脚本中指定64位PowerShell路径,即使C#程序以32位运行也能正常调用:

@echo off
%SystemRoot%\Sysnative\WindowsPowerShell\v1.0\powershell.exe "ForEach($v in (Get-Command -Name 'Set-ProcessMitigation').Parameters['Disable'].Attributes.ValidValues){Set-ProcessMitigation -System -Disable $v.ToString() -ErrorAction SilentlyContinue}"
pause

说明:%SystemRoot%\Sysnative是64位系统给32位进程预留的虚拟路径,用于访问64位系统文件。

方案3:C#直接调用PowerShell(无需CMD脚本)

跳过中间的CMD环节,直接用C#调用PowerShell,更简洁可控:

var psi = new ProcessStartInfo
{
    FileName = "powershell.exe",
    Arguments = @"ForEach($v in (Get-Command -Name 'Set-ProcessMitigation').Parameters['Disable'].Attributes.ValidValues){Set-ProcessMitigation -System -Disable $v.ToString() -ErrorAction SilentlyContinue}",
    UseShellExecute = false,
    RedirectStandardOutput = true,
    RedirectStandardError = true,
    CreateNoWindow = true // 可选,关闭PowerShell窗口
};

using (var process = Process.Start(psi))
{
    process.WaitForExit();
    // 可选:读取输出或错误日志
    string output = process.StandardOutput.ReadToEnd();
    string error = process.StandardError.ReadToEnd();
}

若需强制调用64位PowerShell,将FileName改为@"C:\Windows\Sysnative\WindowsPowerShell\v1.0\powershell.exe"

额外注意事项

Set-ProcessMitigation需要系统级权限,双击CMD时UAC会自动请求权限,但C#程序默认不会。需确保程序以管理员身份运行:

  • 可在项目的app.manifest中设置requestedExecutionLevel为requireAdministrator,让程序启动时自动弹出权限请求。

内容的提问来源于stack exchange,提问作者Fath Bakri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 10:05:37