我有一个 C# WCF 库,我想从 WCF 库中的一个方法调用 cmd 命令,但是当我运行代码并调用该方法时,它既不执行 cmd 命令,也不生成任何类型的异常,我应该怎么办做,我的代码如下..请有人指导我。
我已经在 cmd 上验证了该命令,从 cmd 执行成功,但从 WCF 库执行不成功,所以命令语法没有任何问题。
System.Diagnostics.Process proc = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo Info = new System.Diagnostics.ProcessStartInfo();
Info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
Info.FileName = "cmd.exe";
Info.Arguments=
"\"" + tallyPath + "\"" + " "
+ "/TDL:" + tdlPath + " " + "/LOAD:"
+ cmpCode + " " + "/SETVAR:SVVarUN:"
+ uname + " " + "/SETVAR:SVVarPass:"
+ pwd;
proc.StartInfo = startInfo
proc.Start();
我在某些服务器上遇到了这个问题,这是由于两个问题 1. 安全权限有时会阻止命令行exe并要求确认对话框,该对话框不可见。 2. 使用以下设置解决了另一个问题:
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
编辑后的答案 - 我构建了最简单的 WCF 服务来尝试尽可能地模仿您的场景。我已经测试过它并且工作正常(粘贴在下面)。请注意上面示例中看起来不正确的注释掉的行。您的 StartInfo 也有问题 - 您创建的是“Info”,但设置的“proc.StartInfo = startInfo”似乎不存在 - 它应该设置为“Info”。
using System.Diagnostics;
using System.ServiceModel;
namespace WcfService1
{
[ServiceContract]
public interface IService1
{
[OperationContract]
string RunTally();
}
public class Service1 : IService1
{
public string RunTally()
{
var tallyPath = "C:\\temp\\";
var tallyExe = "tally.exe";
var cmpCode = "myCmpCode";
var uname = "myUname";
var pwd = "myPwd";
var tdlPath = "myTdlPath";
Process proc = new Process();
ProcessStartInfo info = new ProcessStartInfo();
info.WindowStyle = ProcessWindowStyle.Hidden;
info.RedirectStandardOutput = true;
info.RedirectStandardInput = true;
info.RedirectStandardError = true;
info.UseShellExecute = false;
info.Arguments =
// "\"" + tallyPath + "\"" + " "
// +
"/TDL:" + tdlPath + " " + "/LOAD:"
+ cmpCode + " " + "/SETVAR:SVVarUN:"
+ uname + " " + "/SETVAR:SVVarPass:"
+ pwd;
info.FileName = tallyPath + tallyExe;
proc.StartInfo = info;
proc.Start();
var textReceived = "";
while (!proc.StandardOutput.EndOfStream)
{
textReceived += proc.StandardOutput.ReadLine();
}
return string.Format("The call returned: " + textReceived);
}
}
}