C#运行批处理文件,未识别命令

C#运行批处理文件,未识别命令,c#,file,C#,File,我已经在我的c#程序中实现了一种方法来运行一个批处理文件,它可以对上传的任何文件进行病毒扫描 public static Int32 ExecuteCommand(String filePath, Int32 Timeout){ Int32 ExitCode; ProcessStartInfo ProcessInfo = new ProcessStartInfo(); ProcessInfo.CreateNoWindow = true; ProcessInfo.U

我已经在我的c#程序中实现了一种方法来运行一个批处理文件,它可以对上传的任何文件进行病毒扫描

public static Int32 ExecuteCommand(String filePath, Int32 Timeout){
    Int32 ExitCode;
    ProcessStartInfo ProcessInfo = new ProcessStartInfo();
    ProcessInfo.CreateNoWindow = true;
    ProcessInfo.UseShellExecute = true;
    ProcessInfo.FileName = filePath;
    Process proc = Process.Start(ProcessInfo);
    proc.WaitForExit(Timeout);
    ExitCode = proc.ExitCode;
    proc.Close();
    return ExitCode;
 }
好了,现在我的批处理文件

@ECHO OFF
c:
cd "..\AVG\AVG9\"
avgscana.exe /SCAN="..\learninglounge.com.solar.quarantine\" /REPORT="..\learninglounge.com.solar.antivirus\virusReports\report.txt"
编辑:我确实有到avg exe和目录的完全限定链接,但已将此处替换为。。用于向stackoverflow过账。很抱歉,这会造成混乱

所以我的问题是批处理文件的报告端。我可以双击批处理文件,它会扫描并创建报告,没有问题。当我通过我的c#运行它时,我得到一个退出代码2;命令未被识别。如果我删除批处理文件中的报告部分就可以了。现在很明显,这指向写入权限,但我已经检查了这一点,并且模拟用户对目录具有写入权限。我丢了什么东西吗


谢谢大家,您是否检查了所有环境变量的设置是否与从cmd行运行批处理文件的设置完全相同。我很确定可能会有一些不同。还有它是什么样的操作系统。如果这需要提升(vista windows 7),您可能实际上需要在代码中模拟适当的用户。
luke

错误表明,
avgscana.exe
不在执行命令时设置为“当前”的目录中。在Windows资源管理器中单击bat文件时,当前目录将设置为bat文件所在的目录。您的
avgscana.exe
可能位于同一个文件夹中,因此可以正常工作


当您从.Net应用程序执行命令时,当前目录保持不变(如果您没有更改它,则它将是.Net应用程序所在的文件夹)。如果你的.Net应用程序与bat文件不在同一个文件夹中,那么你将得到一个你实际得到的错误。在启动bat之前,您应该在bat文件中指定完整路径,或者在.Net应用程序中设置
环境.CurrentDirectory

好的,我已经做了一个解决方法,我宁愿将报告保存在那里,然后,我只是捕获流程的标准输出,然后保存到文件+任何处理


奇怪的一个。在批处理文件中,您有:

c:
cd "..\AVG\AVG9\"
avgscana.exe 
  /SCAN="..\learninglounge.com.solar.quarantine\"
  /REPORT="..\learninglounge.com.solar.antivirus\virusReports\report.txt"
执行命令时,驱动器C:上的“当前”目录不明确。您只需向上移动目录树。与avgscana.exe命令相同,可以使用相对引用而不是绝对引用

您确定CD命令已将您带到正确的目录吗?将CD命令更改为绝对引用(CD“c:\where\avg\avg9\”),这样可以确保找到avgscana命令的相对引用

您的CD命令可能会以静默方式失败,但avgscana.exe可能在您的路径中,因此会执行该命令,但由于未找到相对的/扫描和/报告位置,因此该命令失败,代码为2


祝你好运

avgscana.exe是否存在于程序所在的目录中?不,不存在,我将删除文件路径并替换为。。从这里的批处理中,但它在实际文件中是完全限定的一些离题建议:Microsoft建议不要使用CLR类型名称,而是使用特定于C的名称。这意味着Int32应该用“int”来声明,以此类推:)为了调试,请尝试对
exe
文件路径和报告
txt
文件路径进行编码-如果它工作,则意味着您需要将批处理文件的路径作为进程参数传递,并使用
%1
读取它。请参阅更新,我确实有硬编码的路径,但为了在这里发布,我已将其替换为。。。很抱歉造成混淆。是的,我运行模拟,并且用户对目录具有写访问权限,我应该检查哪种环境变量?我将更新我的问题,但在批处理文件中,我确实完全限定了指向avg exe的链接以及我希望保存报告的文件夹。我只是把。。我想我已经说过好几次了,我的路径都是绝对的,没有问题。问题在于/Report命令。我移除它,它很好,我通过捕获标准输出并接收扫描结果来证明这一点。我将/报告放回,但失败,退出代码为2。在windows中单击该批处理可以正常工作,但只能通过我的c#程序失败。