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

CMD可执行命令在C# Process中执行失败,报System.NotSupported异常

问题分析与解决方案

你的问题出在管道符|是cmd.exe的专属语法,不是pdftk.exe的命令参数。直接把带管道的字符串传给pdftk,它无法识别这种格式,所以会抛出System.NotSupportedException,自然也不会有输出。

下面给两种可行的解决办法:


方法一:通过cmd.exe执行完整命令

既然管道需要cmd解析,那就让Process调用cmd.exe,把整个命令作为参数传给它。注意给带空格的路径加引号,同时用/C参数让cmd执行完命令后退出。

修改后的代码:

var cmd = @"C:\Dummy Projects\TestBCL\ConsoleApp1\ConsoleApp1\bin\Debug\pdftk.exe D:\TestBCL\Sample.pdf dump_data | findstr NumberOfPages";

var proc = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = "cmd.exe",
        Arguments = $"/C \"{cmd}\"", // /C 表示执行后关闭cmd窗口,引号包裹避免路径空格问题
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    }
};

proc.Start();
var output = proc.StandardOutput.ReadToEnd();
proc.WaitForExit(); // 建议加上等待进程结束,确保输出读取完整

方法二:在C#代码中处理输出(更可靠)

完全绕过cmd的管道,直接调用pdftk获取所有输出,然后在代码里筛选需要的行。这种方式不需要依赖cmd,兼容性更好,也更容易调试。

修改后的代码:

string pdfkPath = @"C:\Dummy Projects\TestBCL\ConsoleApp1\ConsoleApp1\bin\Debug\pdftk.exe";
var arguments = @"D:\TestBCL\Sample.pdf dump_data";

var proc = new Process
{
    StartInfo = new ProcessStartInfo
    {
        FileName = pdfkPath,
        Arguments = arguments,
        UseShellExecute = false,
        RedirectStandardOutput = true,
        CreateNoWindow = true
    }
};

proc.Start();
// 读取所有输出并筛选包含NumberOfPages的行
var outputLines = proc.StandardOutput.ReadToEnd().Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
var targetLine = outputLines.FirstOrDefault(line => line.Contains("NumberOfPages"));
proc.WaitForExit();

两种方法都能解决你的问题,方法二更适合在C#程序中使用,避免了依赖cmd的语法,也更灵活。

内容的提问来源于stack exchange,提问作者Arpit Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 02:44:59