Ich stand vor kurzem vor der Problematik, dass ich ein PowerShell Skript geschrieben habe, welches bei Endbenutzer währen der Windows Anmeldung ausgeführt wurde, und ich wollte verhindert, dass der Endanwender das PowerShell Konsolenfenster zu Gesicht bekommt. Die PowerShell.exe selbst bietet hierfür den „-WindowStyle Hidden“ Parameter, aber dieser funktioniert nicht zu meiner Zufriedenheit, denn dieser lässt trotzdem kurz das PowerShell Konsolenfenster erscheinen bevor er das Fenster ausblendet. Wer noch Windows Script Host kennt, wird sich sicher an die WScript.exe und die CScript.exe erinnern, bei der WScript.exe handelt es sich um eine Windows Script Host ohne Konsole, und genau diese Funktionalität habe ich mir für die Powershell.exe gewünscht. Meine Lösung für diese Problematik bestand dann letztendlich darin, dass ich mir sozusagen eine WScript.exe für PowerShell selbst geschrieben habe, dies ist mit ganz wenigen Zeilen C# Code möglich. Hier mein entsprechender Code.
Ich habe den C# Code so gestaltet, dass es Inline im PowerShell Script enthalten ist und sich selbst kompiliert, im unteren Teil des Scriptes sieht man dann die beispielhafte Verwendung:
# Inline C# code for a simple PowerShell host and compile
$code = @'
using System.Management.Automation;
using System.Collections.ObjectModel;
namespace PowerShellHost {
class Program {
static void Main(string[] args) {
if (args.Length == 0) return;
using (PowerShell ps = PowerShell.Create()) {
string code = System.IO.File.ReadAllText(args[0]);
ps.AddScript(code);
Collection <psobject> psobject = ps.Invoke();
}
}
}
}
'@
# Compile
Add-Type -OutputAssembly "$home\Desktop\PowerShellHost.exe" -OutputType 'WindowsApplication' -TypeDefinition $code
# Generate an example PowerShell script
"Add-Type -AssemblyName 'Microsoft.VisualBasic' ; [Microsoft.VisualBasic.Interaction]::MsgBox('My MsgBox Text', 'YesNoCancel,Question', 'My Title')" | Out-File "$home\Desktop\Example.ps1"
# Example how run the example script via the PowerShell host
& "$home\Desktop\PowerShellHost.exe" "$home\Desktop\Example.ps1"
Hallo Herr Marotti,
ich würde gern ein PS-Script mit Parametern übergeben in der Art
PowershellHost.exe C:\test\meinscript.ps1 -Action Copy -Pfad C:\..
ggf. auch als
PowershellHost.exe C:\test\meinscript.ps1 -Action Copy -Pfad %V bei Einsatz als command in der Registry
Können Sie mir einen Tip geben, wie ich den Code da verändern muss?
Ganz lieben Dank und ich freue mich auf Ihre Rückantwort