我整个上午一直在寻找和试验这个,我很难过。我有一个在IIS中运行的aspx页面并调用以下c#函数。我正在尝试让它运行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#代码执行时:
注意 - 我也尝试修改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;
}
答案 0 :(得分:1)
从ASPX页面运行批处理文件或任何进程是徒劳的,因为IIS不能在真正的Windows用户上下文中运行。因此,无论您为AppPool运行的用户提供了多少设置和权限,或者您所做的任何类型的配置更改,它都将无法工作。很长一段时间我遇到了同样的问题,基本上这是不可能的。
请参阅我之前的问题(和评论),以及可能的“概念”解决方案,以解决当前问题:
答案 1 :(得分:0)
如何不使用&#34; cmd&#34;?
Process proc = new Process ();
proc.StartInfo.FileName = @"c:\mypath\myfile.cmd";