在我的网站中,我希望在将任何上传的文件保存到我的数据库之前对其进行病毒检查。因此,我将文件保存到本地目录,然后从我的C#程序中启动命令行扫描程序进程。这是我使用的代码:
string pathToScannerProgram = Path.Combine(virusCheckFolder, "scan.exe");
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = pathToScannerProgram;
startInfo.Arguments = String.Format("\"{0}\" /FAM /DAM", fileToScanPath);
startInfo.RedirectStandardOutput = true;
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
startInfo.UseShellExecute = false;
using (Process process = new Process())
{
process.StartInfo = startInfo;
process.Start();
string output = process.StandardOutput.ReadToEnd();
string errorLevel = Environment.GetEnvironmentVariable("ERRORLEVEL");
process.WaitForExit();
}
我的问题是Environment.GetEnvironmentVariable(“ERRORLEVEL”)总是返回null。它应该返回一个数字。那么如何在我的C#程序中通过命令行扫描程序设置“ERRORLEVEL”?
答案 0 :(得分:17)
据我所知,这只是您流程的ExitCode。使用它。
只有在等待进程结束后检查才有用。顺便提一下。
答案 1 :(得分:6)
您似乎已经翻译了一个批处理脚本,该脚本会检查代替的ERRORLEVEL特殊变量或者更熟悉的unix脚本退出代码。
ERRORLEVEL是一个特殊变量,对应于进程的ExitCode。
尝试做的代码是从子进程设置的自己的进程中读取环境变量。
在这种似乎正在执行此操作的批处理脚本的情况下,实际上它们依赖于操作系统的脚本环境来在laucnhed进程退出时为您更改此特殊变量。 当试图在更全面的特色编程环境中复制类似的功能时,这是有问题的(为什么这将是一个糟糕的想法,从c#考虑如果两个线程同时启动两个进程将会发生什么)。
相反,你有一个很好的API用于与子进程交互,惯用的等价物如下:
using (Process process = new Process())
{
process.StartInfo = startInfo;
process.Start();
// only if you need the output for debugging
//string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
return process.ExitCode;
}
请注意(与其他答案一样)您必须先等待进程退出才能查看退出代码。