Как легко запускать команды оболочки с помощью c#?
Как использовать 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"), которые должны выполняться в одной командной строке в определенной последовательности, в которой они помещаются в массив. Спасибо.
6 ответов:
, который должен выполняться в одной командной строке в конкретном последовательность, в которой они помещаются в массив
Вы можете записать последовательность команд в файл 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();
Я не буду заполнять пробел (рыбу) для вас, но вместо этого дам вам удочку: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.aspx
Проверьте класс Process.
Что ты пытаешься сделать? Если вы рассматриваете выполнение сценариев и также используете .Net framework, посмотрите на Powershell
Вы можете использовать все команды, которые вы упоминаете как таковые в сценариях Powerhsell-cd, ipconfig,nslookup, ping и т. д.
Здесь Вы можете найти решение для запуска команд оболочки в комплекте с исходным кодом... он даже принимает во внимание stderr.
Но как указал @SLaks : есть лучшие способы сделать то, что вы описываете, используя .NET Framework (т. е.
System.IOи ещеSystem.Net)!Другие интересные ресурсы:
Для этой цели я написал оболочку динамического класса. Вы можете использовать его следующим образом:
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.Вот класс (он использует систему.Пакет Automation nuget для функций powershell):
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; } } } }
Comments