C#调用Exiftool无法写入CSV 输出直接显示至屏幕问题
问题根因
> 输出重定向是cmd.exe的内置shell语法,不属于exiftool的原生命令参数。
当前C#代码将UseShellExecute设置为false时,会直接唤起exiftool.exe进程,不会经过命令行解释器解析重定向规则。这种场景下exiftool会把参数中的>符号、后续的CSV文件路径全部识别为普通传入参数,自然会把CSV路径判定为待扫描的第二个目录,所有输出直接打印到进程窗口,不会写入目标文件。
手动在CMD窗口执行命令能正常运行,本质是CMD提前捕获了>重定向语法,自行完成了输出流转发逻辑,根本没有把>和后续文件路径传递给exiftool进程。
修复方案
两种实现方式可根据需求选择:
方案1:通过C#捕获标准输出写入文件(推荐,匹配正式业务逻辑)
exiftool的-csv参数默认会将CSV格式内容输出到标准输出流,完全可以移除参数里的重定向片段,直接通过C#的进程重定向能力读取输出内容写入文件,不需要提前手动创建空文件。
修改后的代码示例:
Process prc_exifTool = new Process(); prc_exifTool.StartInfo.UseShellExecute = false; prc_exifTool.StartInfo.FileName = "exiftool.exe"; prc_exifTool.StartInfo.CreateNoWindow = false; // 调试阶段保留可见窗口,正式环境可设为true // 移除参数末尾的重定向部分 prc_exifTool.StartInfo.Arguments = "-a -g -s -charset filename=utf8 -charset exif=utf8 -charset iptc=utf8 -ee -struct -progress -c \"%.6f\" -GPSAltitude -exif:GPSAltitude -ext jpg -csv -Directory \"D:\\temp\""; // 开启标准输出重定向 prc_exifTool.StartInfo.RedirectStandardOutput = true; prc_exifTool.Start(); // 读取输出内容写入目标CSV string csvContent = prc_exifTool.StandardOutput.ReadToEnd(); File.WriteAllText(Path.Combine(Path.GetTempPath(), tmpCSVFileName), csvContent, Encoding.UTF8); prc_exifTool.WaitForExit();
注意:正式环境部署时需要移除参数里的-k,否则exiftool执行完成后会等待用户回车输入,导致进程一直挂起。
方案2:通过cmd.exe启动命令,复用shell重定向能力
如果要保留原命令的>重定向写法,不要直接启动exiftool.exe,改为启动cmd.exe,将整条exiftool命令作为参数传入,由cmd负责解析重定向逻辑,执行效果和手动在CMD敲命令完全一致。
修改后的代码示例:
Process prc_exifTool = new Process(); prc_exifTool.StartInfo.UseShellExecute = false; prc_exifTool.StartInfo.FileName = "cmd.exe"; prc_exifTool.StartInfo.CreateNoWindow = false; // 通过/c参数告知cmd执行后续整条命令,注意路径转义 prc_exifTool.StartInfo.Arguments = "/c exiftool.exe -a -g -s -charset filename=utf8 -charset exif=utf8 -charset iptc=utf8 -ee -struct -progress -c \"%.6f\" -GPSAltitude -exif:GPSAltitude -ext jpg -csv -Directory \"D:\\temp\" > \"C:\\Users\\nemet\\AppData\\Local\\Temp\\temp.csv\""; prc_exifTool.Start(); prc_exifTool.WaitForExit();
该方案不需要提前手动创建空CSV文件,cmd执行重定向时会自动生成目标文件。
内容的提问来源于stack exchange,提问作者nemethv
相关产品推荐
相关产品推荐

