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
相关产品推荐
相关产品推荐

