WCF:如何在远程计算机上启动简单的cmd命令

问题描述 投票:1回答:1

所以我在远程机器上运行WCF服务器。这个服务器收到简单的字符串作为参数,我希望这个参数通过command line执行。

这是服务器端需要执行command的功能:

public void ExecuteCmdCommand(string arguments)
    {
        log.Info(arguments);
        Process process = new Process();
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.WindowStyle = ProcessWindowStyle.Maximized;
        startInfo.RedirectStandardOutput = true;
        startInfo.UseShellExecute = false;
        startInfo.FileName = "cmd.exe";
        startInfo.Arguments = arguments;
        log.Debug(startInfo.Arguments);
        process.StartInfo = startInfo;
        process.OutputDataReceived += (sender, args) =>
        {                
            log.Info(args.Data);
        };

        process.Start();
        process.BeginOutputReadLine();
        process.WaitForExit();
    }

正如你在本function开头所见,我打印到我的console收到的command

所以我尝试通过传递参数notepad启动notepad,我可以通过控制台看到服务器端收到命令,所以我可以确定通信工作但没有任何反应。

我做错了什么?我本地机器上的同一命令启动notepad

更新

notepad工作正常(最后没有.exe),但当我发送命令appium(我想开始我的appium服务器)我得到这个error发送commandserver(但server收到'appium'命令) :

System.ServiceModel.FaultException:'由于内部错误,服务器无法处理请求。有关错误的更多信息,请在服务器上启用IncludeExceptionDetailInFaults(来自ServiceBehaviorAttribute或配置行为),以便将异常信息发送回客户端,或者根据Microsoft .NET Framework SDK文档启用跟踪和检查服务器跟踪日志。'

c# wcf cmd
1个回答
1
投票

进程的FileName不正确,“cmd.exe”。你可以试试这个:

ProcessStartInfo startInfo = new ProcessStartInfo(arguments);
startInfo.WindowStyle = ProcessWindowStyle.Maximized;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;

并在参数中传递以下内容:

notepad.exe

有关ProcessStartInfo类的详细概述,请查看here

我建议您考虑一下您希望传递参数的情况以及与您要启动的过程相关的一些参数。例如,您可能想要启动记事本并打开文件。该文件也应作为参数传递。所以我认为一个更好的方法是使arguments成为一个字符串数组,并按照约定,数组的第一个元素是你想要启动的程序,数组的其余元素是程序的参数。

© www.soinside.com 2019 - 2024. All rights reserved.