ejecutar desde c# powershell console

c# - desde - ¿Cómo modificar la línea anterior del texto de la consola?



ejecutar powershell desde c# (3)

Use un retorno de carro. Esta muestra imprime una sola línea, sobrescribiendo lo que estaba allí antes.

Console.WriteLine(); for (int i = 0; i <= 100; i++) { System.Threading.Thread.Sleep(10); Console.Write("/x000DProgress: " + i); }

Esto funciona siempre que todas sus cadenas tengan menos de 80 columnas (o lo que sea que esté configurado en el buffer de su terminal).

Me gustaría lograr algo como esto:

Time consuming operation...OK Another time consuming operation... And another one, but it completed, so...OK

Mostré 3 líneas de texto, cada una relacionada con un hilo que puede terminar tarde o temprano. Pero si el segundo completa más tarde que el tercero, obtendré algo como esto:

Time consuming operation...OK Another time consuming operation... And another one, but it completed, so...OKOK

Lo cual es, por supuesto, inaceptable. Sé cómo volver en la línea actual, pero ¿hay alguna manera de subir? Juraría que lo he visto en alguna parte, aunque podría ser una consola Linux :)

Olvídalo. ¡Vea el administrador de archivos lejanos! Funciona en la consola de Windows, ¡funciona incluso en PowerShell! ¿Cómo hacer algo como esto? Y la mejor parte es que restablece el estado de la consola después de salir. Entonces, tal vez debería preguntar: ¿cómo acceder al buffer de la consola directamente? Supongo que necesitaré algún código nativo para hacer el truco, pero ¿tal vez hay otra manera? Pensé en borrar la consola con cada actualización, pero esto parece excesivo. O tal vez no es? ¿Parpadeará?



Nota: la respuesta siguiente fue editada originalmente en la pregunta por el OP.

Aquí hay una solución completa con demostración:

using System; using System.Collections.Generic; using System.Threading; namespace PowerConsole { internal class Containers { internal struct Container { public int Id; public int X; public int Y; public string Content; } public static List<Container> Items = new List<Container>(); private static int Identity = 0; public static int Add(string text) { var c = new Container(); c.Id = Identity++; c.X = Console.CursorLeft; c.Y = Console.CursorTop; c.Content = text; Console.Write(text); Items.Add(c); return c.Id; } public static void Remove(int id) { Items.RemoveAt(id); } public static void Replace(int id, string text) { int x = Console.CursorLeft, y = Console.CursorTop; Container c = Items[id]; Console.MoveBufferArea( c.X + c.Content.Length, c.Y, Console.BufferWidth - c.X - text.Length, 1, c.X + text.Length, c.Y ); Console.CursorLeft = c.X; Console.CursorTop = c.Y; Console.Write(text); c.Content = text; Console.CursorLeft = x; Console.CursorTop = y; } public static void Clear() { Items.Clear(); Identity = 0; } } internal class Program { private static List<Thread> Threads = new List<Thread>(); private static void Main(string[] args) { Console.WriteLine("So we have some threads:/r/n"); int i, id; Random r = new Random(); for (i = 0; i < 10; i++) { Console.Write("Starting thread " + i + "...["); id = Containers.Add("?"); Console.WriteLine("]"); Thread t = new Thread((object data) => { Thread.Sleep(r.Next(5000) + 100); Console.ForegroundColor = ConsoleColor.Green; Containers.Replace((int)data, "DONE"); Console.ResetColor(); }); Threads.Add(t); } Console.WriteLine("/n/"But will it blend?/"..."); Console.ReadKey(true); i = 0; Threads.ForEach(t => t.Start(i++)); Threads.ForEach(t => t.Join()); Console.WriteLine("/r/nVoila."); Console.ReadKey(true); } } }