如何使用c#轻松运行shell命令

本文关键字:运行 shell 命令 何使用 | 更新日期: 2023-09-27 18:09:07

如何使用c#运行命令提示符命令?假设我想按顺序运行这些命令:

cd F:/File/File2/...FileX/
ipconfig
ping google.com

之类的…

void runCommands(String[] commands) 
{
    //method guts...
}

,这样你的输入是一系列字符串命令(即["ipconfig","ping 192.168.192.168","ping google.com","nslookup facebook.com"),应该在一个命令提示符上执行,按照它们被放入数组的特定顺序。谢谢。

如何使用c#轻松运行shell命令

应该在指定的命令提示符上执行数组

中的序列。

您可以在bat文件中编写命令序列并运行如下:

// Start the child process.
 Process p = new Process();
 // Redirect the output stream of the child process.
 p.StartInfo.UseShellExecute = false;
 p.StartInfo.RedirectStandardOutput = true;
 p.StartInfo.FileName = "YOURBATCHFILE.bat";
 p.Start();
 // Do not wait for the child process to exit before
 // reading to the end of its redirected stream.
 // p.WaitForExit();
 // Read the output stream first and then wait.
 string output = p.StandardOutput.ReadToEnd();
 p.WaitForExit();
参考

我为此编写了一个动态类Shell。你可以这样使用:

var shell = new Shell();
shell.Notepad("readme.txt"); // for "notepad.exe readme.txt"
shell.Git("push", "http://myserver.com"); // for "git push http://myserver.com"
shell.Ps("ls"); // for executing "ls" in powershell;
shell.Instance; // The powershell instance of this shell.

这是类(它使用系统)。powershell功能的自动化nuget包):

using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Diagnostics;
using System.Management.Automation;
namespace System.Diagnostics {
    public class Shell : System.Dynamic.DynamicObject {
        public Shell(): base() { }
        public Shell(bool window) { Window = window; }
        static string[] ScriptExtensions = new string[] { ".exe", ".cmd", ".bat", ".ps1", ".csx", ".vbs" };
        public string Path { get { return Environment.GetEnvironmentVariable("PATH"); } set { Environment.SetEnvironmentVariable("PATH", value); } }
        PowerShell pshell = null;
        public PowerShell Instance { get { return pshell ?? pshell = PowerShell.Create(); } }
        public bool Window { get; set; }
        public ICollection<PSObject> Ps(string cmd) {
            Instance.AddScript(cmd);
            return Instance.Invoke();
        }
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result) {
            var exe = Path.Split(';').SelectMany(p => ScriptExtensions.Select(ext => binder.Name + ext)).FirstOrDefault(p => File.Exists(p));
            if (exe == null) exe = binder.Name + ".exe";
            var info = new ProcessStartInfo(exe);
            var sb = new StringBuilder();
            foreach (var arg in args) {
                var t = arg.ToString();
                if (sb.Length > 0) sb.Append(' ');
                if (t.Contains(' ')) { sb.Append('"'); sb.Append(t); sb.Append('"'); } else sb.Append(t);
            }
            info.Arguments = sb.ToString();
            info.CreateNoWindow = !Window;
            info.UseShellExecute = false;
            info.WindowStyle = Window ? ProcessWindowStyle.Normal : ProcessWindowStyle.Hidden;
            try {
                var p = Process.Start(info);
                p.WaitForExit();
                result = p.ExitCode;
                return true;
            } catch {
                result = null;
                return false;
            }
        }
    }
}

我不给你填空白(鱼),而是给你棒子:http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx

查看Process类

您应该使用。net等价的,可以在System.IOSystem.Net中找到。

你想干什么?如果你正在考虑编写脚本并使用。net框架,可以看看Powershell

你可以在Powerhsell脚本中使用你提到的所有命令- cd, ipconfig, nslookup, ping等

在这里您可以找到运行shell命令的完整源代码的解决方案…它甚至考虑了错误

但是正如@SLaks指出的:有更好的方法来做你所描述的使用。net框架(即System.IOSystem.Net)!

其他有趣的资源:

  • http://msdn.microsoft.com/en-us/library/ccf1tfx0.aspx
  • http://msdn.microsoft.com/en-us/library/system.diagnostics.process.startinfo.aspx