我整个上午一直在搜索和尝试这一操作,但感到很困惑。我有一个在IIS中运行并调用以下c#函数的aspx页面。我试图让它运行一个cmd文件并从cmd文件返回输出。我在下面的代码中尝试了五个不同的选项:

protected String RunMyCmdFileAndGetResponse() {
    Process proc = new Process ();
    proc.StartInfo.FileName = @"c:\Windows\System32\cmd.exe";
//  proc.StartInfo.Arguments = @"/c echo hello";                    <== 1
//  proc.StartInfo.Arguments = @"/c c:\mypath\myfile_badname.cmd";  <== 2
//  proc.StartInfo.Arguments = @"/c type c:\mypath\myfile.cmd";     <== 3
    proc.StartInfo.Arguments = @"/c c:\mypath\myfile.cmd";      //  <== 4
//  proc.StartInfo.Arguments = @"/c call c:\mypath\myfile.cmd";     <== 5
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardError = true;
    proc.StartInfo.CreateNoWindow = true;

    proc.Start();
    string response = proc.StandardOutput.ReadToEnd();
    response += proc.StandardError.ReadToEnd();
    proc.WaitForExit();
    return response;
}


Cmd文件c:\ mypath \ myfile.cmd的内容为:

@echo test line 1 > c:\mypath\myfilelog.txt
@echo test line 2


手动运行时,此cmd文件会按预期工作,生成myfilelog.txt并返回测试行2。使用c#代码执行时:


选项1起作用-按预期返回“ hello”响应。
选项2失败,表明myfile_badname.cmd无法识别为有效命令
选项3按预期方式工作-它返回myfile.cmd的内容作为响应-这确认我能够找到并读取文件。
选项4不起作用-应该尽我所能。它不会挂断,但也不会返回任何响应,并且不会执行cmd文件(不会生成myfilelog.txt)。
选项5-与选项4相同的结果。


注意-我也尝试修改myfile.cmd以删除第1行(创建日志文件),而仅留下第2行以回显响应。以防万一这是创建日志文件的权限问题。结果相同。

任何帮助,将不胜感激!

更新以添加解决方案:

@MaxOvrdrv的回答让我想到了另一种方式。在带有UseShellExecute = false的IIS上下文中运行Process.Start时,确实确实存在某种限制-如果主参数是可执行文件(cmd文件,脚本文件等),它将不会运行它。我尝试将SomeExample.cmd传递给cmd.exe,并将SomeExample.js传递给cscript.exe。

但是...我可以使用间接级别来欺骗它,以使可执行文件名不再是第一个参数,并且那样工作也很好。

运行cmd文件:

string theResponse = RunMyCmdAndGetResponse(@"c:\somepath\mycmd.cmd");

protected String RunMyCmdAndGetResponse(string cmdPath) {
    Process proc = new Process ();
    proc.StartInfo.FileName = @"c:\Windows\System32\cmd.exe";
    proc.StartInfo.Arguments = "/c cmd /c " + cmdPath;
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardError = true;
    proc.StartInfo.CreateNoWindow = true;

    proc.Start();
    proc.WaitForExit();
    string response = proc.StandardOutput.ReadToEnd();
    response += proc.StandardError.ReadToEnd();
    return response;
}


要运行脚本文件:

string theResponse = RunMyScriptAndGetResponse(@"c:\somepath\myscript.js");

protected String RunMyScriptAndGetResponse(string scriptPath) {
    Process proc = new Process ();
    proc.StartInfo.FileName = @"c:\Windows\System32\cmd.exe";
    proc.StartInfo.Arguments = "/c cscript //nologo " + scriptPath;
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.RedirectStandardOutput = true;
    proc.StartInfo.RedirectStandardError = true;
    proc.StartInfo.CreateNoWindow = true;

    proc.Start();
    proc.WaitForExit();
    string response = proc.StandardOutput.ReadToEnd();
    response += proc.StandardError.ReadToEnd();
    return response;
}

最佳答案

由于IIS不在真实的Windows用户上下文下运行,因此从ASPX页运行批处理文件或按任何说法进行任何处理都是徒劳的。因此,无论您给用户运行AppPool的设置和权限有多少,还是您对配置进行了任何类型的更改,它都将永远无法使用。我很久以前就遇到了同样的问题,基本上是不可能的。

请参阅我以前的问题(和评论),以及可以接受的答案,以解决您当前问题的“概念性”解决方案,这里:

Process.Start won't work

关于c# - 在IIS中运行时,Process.Start cmd.exe不会运行作为参数传递的cmd文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28590924/

10-12 12:43
查看更多