diff --git a/PowerShellBlazor/Models/Message.cs b/PowerShellBlazor/Models/Message.cs new file mode 100644 index 0000000..eb51fe1 --- /dev/null +++ b/PowerShellBlazor/Models/Message.cs @@ -0,0 +1,11 @@ +using System; +namespace PowerShellBlazor.Models +{ + public enum PSStream { Output, Information, Progress, Warning, Error } + + public class Message + { + public PSStream PSStream; + public string Data; + } +} \ No newline at end of file diff --git a/PowerShellBlazor/Pages/Index.razor b/PowerShellBlazor/Pages/Index.razor index 9460e1f..08af79e 100644 --- a/PowerShellBlazor/Pages/Index.razor +++ b/PowerShellBlazor/Pages/Index.razor @@ -1,7 +1,5 @@ -@page "/" +@page "/" @inject IPowerShellService PowerShellService -@inject IWebHostEnvironment WebHostEnvironment -@using System.Management.Automation;
@@ -16,9 +14,11 @@
-@foreach (MarkupString line in PowerShellService.Output) +@foreach (var message in PowerShellService.Output) { - @line; +
+ @((MarkupString)message.Data) +
} @code @@ -33,14 +33,11 @@ protected void RunScript() { PowerShellService.Output = new(); - string pscommand = Path.Combine(WebHostEnvironment.ContentRootPath, "Scripts/" + script); - PowerShell shell = PowerShell.Create(); - shell.AddCommand(pscommand); PowerShellService.OutputChanged += OutputChanged; - Task.Run(() => PowerShellService.RunScript(shell, true)); + Task.Run(() => PowerShellService.RunScript(script)); } - private void OutputChanged(object sender, List newOutput) + private void OutputChanged(object sender, List newOutput) { InvokeAsync(() => this.StateHasChanged()); } diff --git a/PowerShellBlazor/Pages/Index.razor.css b/PowerShellBlazor/Pages/Index.razor.css new file mode 100644 index 0000000..fe16868 --- /dev/null +++ b/PowerShellBlazor/Pages/Index.razor.css @@ -0,0 +1,27 @@ +.Output { + color: black +} + +.Progress { + color: green +} + +.Information { + color: blue +} + +.Warning::before { + content: "*** Warning ***: " +} + +.Warning { + color: orange +} + +.Error::before { + content: "*** Error ***: " +} + +.Error { + color: red +} diff --git a/PowerShellBlazor/PowerShellBlazor.csproj b/PowerShellBlazor/PowerShellBlazor.csproj index efa20b9..b724112 100644 --- a/PowerShellBlazor/PowerShellBlazor.csproj +++ b/PowerShellBlazor/PowerShellBlazor.csproj @@ -9,9 +9,11 @@ + + diff --git a/PowerShellBlazor/Program.cs b/PowerShellBlazor/Program.cs index c607de4..c06267c 100644 --- a/PowerShellBlazor/Program.cs +++ b/PowerShellBlazor/Program.cs @@ -1,6 +1,6 @@ -using Microsoft.AspNetCore.Components; +global using PowerShellBlazor.Models; +using Microsoft.AspNetCore.Components; using Microsoft.AspNetCore.Components.Web; -using PowerShellBlazor.Data; using PowerShellBlazor.Services; var builder = WebApplication.CreateBuilder(args); diff --git a/PowerShellBlazor/Scripts/test.ps1 b/PowerShellBlazor/Scripts/test.ps1 index b3bc198..794db43 100644 --- a/PowerShellBlazor/Scripts/test.ps1 +++ b/PowerShellBlazor/Scripts/test.ps1 @@ -1,5 +1,6 @@ -for ($i=1; $i -le 5; $i++) { +for ($i=1; $i -le 5; $i++) { Write-Progress "Loop $i - progress output (Write-Progress)" + Write-Information "Here's some information (Write-Information)" Write-Output "Normal output text (Write-Output)" Write-Warning "Here's some warning text (Write-Warning)" Write-Error "Oh no, here's some error text (Write-Error)" diff --git a/PowerShellBlazor/Services/IPowerShellService.cs b/PowerShellBlazor/Services/IPowerShellService.cs index 96d2bbb..80976cb 100644 --- a/PowerShellBlazor/Services/IPowerShellService.cs +++ b/PowerShellBlazor/Services/IPowerShellService.cs @@ -1,13 +1,13 @@ -using System; +using System; using System.Management.Automation; namespace PowerShellBlazor.Services { public interface IPowerShellService { - public List Output { get; set; } - public Task RunScript(PowerShell shell, bool varwidth); + public List Output { get; set; } + public Task RunScript(string script); - event EventHandler> OutputChanged; + event EventHandler> OutputChanged; } } \ No newline at end of file diff --git a/PowerShellBlazor/Services/PowerShellService.cs b/PowerShellBlazor/Services/PowerShellService.cs index c68d2fb..9ae9063 100644 --- a/PowerShellBlazor/Services/PowerShellService.cs +++ b/PowerShellBlazor/Services/PowerShellService.cs @@ -1,11 +1,89 @@ -using System; -using System.Collections.ObjectModel; using System.Management.Automation; namespace PowerShellBlazor.Services { public class PowerShellService : IPowerShellService { + private IWebHostEnvironment _WebHostEnvironment; + + public PowerShellService(IWebHostEnvironment webHostEnvironment) + { + _WebHostEnvironment = webHostEnvironment; + } + + public List Output { get; set; } = new(); + + private Message prevMsg = new(); + + private void AddOutput(PSStream stream, string message) + { + Message msg = new() + { + PSStream = stream, + Data = message + }; + + if (msg == prevMsg) + { + Output.Last().Data += "."; + } + else + { + Output.Add(msg); + prevMsg = msg; + } + OutputChanged.Invoke(this, Output); + } + + public event EventHandler> OutputChanged; + + public async Task RunScript(string script) + { + string pscommand = Path.Combine(_WebHostEnvironment.ContentRootPath, "Scripts/" + script); + if (!File.Exists(pscommand)) + { + AddOutput(PSStream.Error, "File not found: " + pscommand); + } + else + { + PowerShell shell = PowerShell.Create(); + shell.AddCommand(pscommand); + + string fontstr = ""; + + AddOutput(PSStream.Output, "Executing: " + shell.Commands.Commands[0].ToString()); + string prevmsg = ""; + string msg = ""; + + AddOutput(PSStream.Output, "BEGIN"); + AddOutput(PSStream.Output, "_________________________________________________________________________"); + + var psOutput = new PSDataCollection(); + + psOutput.DataAdded += delegate (object? sender, DataAddedEventArgs e) + { + AddOutput(PSStream.Output, psOutput[e.Index].ToString()); + }; + + shell.Streams.Information.DataAdded += delegate (object? sender, DataAddedEventArgs e) + { + AddOutput(PSStream.Information, shell.Streams.Information[e.Index].ToString()); + }; + + shell.Streams.Progress.DataAdded += delegate (object? sender, DataAddedEventArgs e) + { + AddOutput(PSStream.Progress, shell.Streams.Progress[e.Index].Activity.ToString()); + }; + + shell.Streams.Warning.DataAdded += delegate (object? sender, DataAddedEventArgs e) + { + AddOutput(PSStream.Warning, shell.Streams.Warning[e.Index].ToString()); + }; + + shell.Streams.Error.DataAdded += delegate (object? sender, DataAddedEventArgs e) + { + AddOutput(PSStream.Error, shell.Streams.Error[e.Index].ToString()); +======= public List Output { get; set; } = new(); private void AddOutput(string str) @@ -129,9 +207,8 @@ namespace PowerShellBlazor.Services // Wait for powershell command to finish IasyncResult.AsyncWaitHandle.WaitOne(); - - AddOutput("
_________________________________________________________________________"); - AddOutput("
EXECUTION COMPLETE"); + AddOutput(PSStream.Output, "_________________________________________________________________________"); + AddOutput(PSStream.Output, "EXECUTION COMPLETE"); } } } diff --git a/PowerShellBlazor/Shared/MainLayout.razor b/PowerShellBlazor/Shared/MainLayout.razor index dba6479..b5a8f47 100644 --- a/PowerShellBlazor/Shared/MainLayout.razor +++ b/PowerShellBlazor/Shared/MainLayout.razor @@ -1,6 +1,6 @@ -@inherits LayoutComponentBase +@inherits LayoutComponentBase -PowerShellBlazor +PowerShell Blazor