如何从WCF库C#调用cmd命令

问题描述 投票:0回答:2

我有一个 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();
c# wcf
2个回答
0
投票

我在某些服务器上遇到了这个问题,这是由于两个问题 1. 安全权限有时会阻止命令行exe并要求确认对话框,该对话框不可见。 2. 使用以下设置解决了另一个问题:

process.StartInfo.UseShellExecute = false;
     process.StartInfo.RedirectStandardOutput = true;
     process.StartInfo.RedirectStandardError = true;
     process.StartInfo.RedirectStandardInput = true;

0
投票

编辑后的答案 - 我构建了最简单的 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);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.