FlyFar

`Compiler.ps1 - Converts PowerShell scripts to standalone executables

Jul 10th, 2023
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <#
  2. .SYNOPSIS
  3. Converts powershell scripts to standalone executables.
  4. .DESCRIPTION
  5. Converts powershell scripts to standalone executables. GUI output and input is activated with one switch,
  6. real windows executables are generated. You may use the graphical front end Win-PS2EXE for convenience.
  7.  
  8. Please see Remarks on project page for topics "GUI mode output formatting", "Config files", "Password security",
  9. "Script variables" and "Window in background in -noConsole mode".
  10.  
  11. A generated executable has the following reserved parameters:
  12.  
  13. -debug              Forces the executable to be debugged. It calls "System.Diagnostics.Debugger.Launch()".
  14. -extract:<FILENAME> Extracts the powerShell script inside the executable and saves it as FILENAME.
  15.                                         The script will not be executed.
  16. -wait               At the end of the script execution it writes "Hit any key to exit..." and waits for a
  17.                                         key to be pressed.
  18. -end                All following options will be passed to the script inside the executable.
  19.                                         All preceding options are used by the executable itself.
  20. .PARAMETER inputFile
  21. Powershell script to convert to executable (file has to be UTF8 or UTF16 encoded)
  22. .PARAMETER outputFile
  23. destination executable file name or folder, defaults to inputFile with extension '.exe'
  24. .PARAMETER prepareDebug
  25. create helpful information for debugging of generated executable. See parameter -debug there
  26. .PARAMETER runtime20
  27. this switch forces PS2EXE to create a config file for the generated executable that contains the
  28. "supported .NET Framework versions" setting for .NET Framework 2.0/3.x for PowerShell 2.0
  29. .PARAMETER runtime40
  30. this switch forces PS2EXE to create a config file for the generated executable that contains the
  31. "supported .NET Framework versions" setting for .NET Framework 4.x for PowerShell 3.0 or higher
  32. .PARAMETER x86
  33. compile for 32-bit runtime only
  34. .PARAMETER x64
  35. compile for 64-bit runtime only
  36. .PARAMETER lcid
  37. location ID for the compiled executable. Current user culture if not specified
  38. .PARAMETER STA
  39. Single Thread Apartment mode
  40. .PARAMETER MTA
  41. Multi Thread Apartment mode
  42. .PARAMETER nested
  43. internal use
  44. .PARAMETER noConsole
  45. the resulting executable will be a Windows Forms app without a console window.
  46. You might want to pipe your output to Out-String to prevent a message box for every line of output
  47. (example: dir C:\ | Out-String)
  48. .PARAMETER UNICODEEncoding
  49. encode output as UNICODE in console mode, useful to display special encoded chars
  50. .PARAMETER credentialGUI
  51. use GUI for prompting credentials in console mode instead of console input
  52. .PARAMETER iconFile
  53. icon file name for the compiled executable
  54. .PARAMETER title
  55. title information (displayed in details tab of Windows Explorer's properties dialog)
  56. .PARAMETER description
  57. description information (not displayed, but embedded in executable)
  58. .PARAMETER company
  59. company information (not displayed, but embedded in executable)
  60. .PARAMETER product
  61. product information (displayed in details tab of Windows Explorer's properties dialog)
  62. .PARAMETER copyright
  63. copyright information (displayed in details tab of Windows Explorer's properties dialog)
  64. .PARAMETER trademark
  65. trademark information (displayed in details tab of Windows Explorer's properties dialog)
  66. .PARAMETER version
  67. version information (displayed in details tab of Windows Explorer's properties dialog)
  68. .PARAMETER configFile
  69. write a config file (<outputfile>.exe.config)
  70. .PARAMETER noConfigFile
  71. compatibility parameter
  72. .PARAMETER noOutput
  73. the resulting executable will generate no standard output (includes verbose and information channel)
  74. .PARAMETER noError
  75. the resulting executable will generate no error output (includes warning and debug channel)
  76. .PARAMETER noVisualStyles
  77. disable visual styles for a generated windows GUI application. Only applicable with parameter -noConsole
  78. .PARAMETER exitOnCancel
  79. exits program when Cancel or "X" is selected in a Read-Host input box. Only applicable with parameter -noConsole
  80. .PARAMETER DPIAware
  81. if display scaling is activated, GUI controls will be scaled if possible. Only applicable with parameter -noConsole
  82. .PARAMETER requireAdmin
  83. if UAC is enabled, compiled executable will run only in elevated context (UAC dialog appears if required)
  84. .PARAMETER supportOS
  85. use functions of newest Windows versions (execute [Environment]::OSVersion to see the difference)
  86. .PARAMETER virtualize
  87. application virtualization is activated (forcing x86 runtime)
  88. .PARAMETER longPaths
  89. enable long paths ( > 260 characters) if enabled on OS (works only with Windows 10)
  90. .EXAMPLE
  91. ps2exe.ps1 C:\Data\MyScript.ps1
  92. Compiles C:\Data\MyScript.ps1 to C:\Data\MyScript.exe as console executable
  93. .EXAMPLE
  94. ps2exe.ps1 -inputFile C:\Data\MyScript.ps1 -outputFile C:\Data\MyScriptGUI.exe -iconFile C:\Data\Icon.ico -noConsole -title "MyScript" -version 0.0.0.1
  95. Compiles C:\Data\MyScript.ps1 to C:\Data\MyScriptGUI.exe as graphical executable, icon and meta data
  96. .NOTES
  97. Version: 0.5.0.27
  98. Date: 2021-11-21
  99. Author: Ingo Karstein, Markus Scholtes
  100. .LINK
  101. https://github.com/MScholtes/TechNet-Gallery
  102. #>
  103.  
  104. [CmdletBinding()]
  105. Param([STRING]$inputFile = ".\Trojan.ps1", [STRING]$outputFile = $NULL, [SWITCH]$prepareDebug, [SWITCH]$runtime20, [SWITCH]$runtime40, [SWITCH]$x86,
  106.     [SWITCH]$x64, [int]$lcid, [SWITCH]$STA, [SWITCH]$MTA, [SWITCH]$nested, [SWITCH]$noConsole, [SWITCH]$UNICODEEncoding, [SWITCH]$credentialGUI,
  107.     [STRING]$iconFile = $NULL, [STRING]$title, [STRING]$description, [STRING]$company, [STRING]$product, [STRING]$copyright, [STRING]$trademark,
  108.     [STRING]$version, [SWITCH]$configFile, [SWITCH]$noConfigFile, [SWITCH]$noOutput, [SWITCH]$noError, [SWITCH]$noVisualStyles, [SWITCH]$exitOnCancel,
  109.     [SWITCH]$DPIAware, [SWITCH]$requireAdmin, [SWITCH]$supportOS, [SWITCH]$virtualize, [SWITCH]$longPaths)
  110.  
  111. <################################################################################>
  112. <##                                                                            ##>
  113. <##      PS2EXE-GUI v0.5.0.27                                                  ##>
  114. <##      Written by: Ingo Karstein (http://blog.karstein-consulting.com)       ##>
  115. <##      Reworked and GUI support by Markus Scholtes                           ##>
  116. <##                                                                            ##>
  117. <##      This script is released under Microsoft Public Licence                ##>
  118. <##          that can be downloaded here:                                      ##>
  119. <##          http://www.microsoft.com/opensource/licenses.mspx#Ms-PL           ##>
  120. <##                                                                            ##>
  121. <################################################################################>
  122.  
  123. if (!$nested)
  124. {
  125.     Write-Output "PS2EXE-GUI v0.5.0.27 by Ingo Karstein`n"
  126. }
  127. else
  128. {
  129.     if ($PSVersionTable.PSVersion.Major -eq 2)
  130.     {
  131.         Write-Output "PowerShell 2.0 environment started...`n"
  132.     }
  133.     else
  134.     {
  135.         Write-Output "PowerShell Desktop environment started...`n"
  136.     }
  137. }
  138.  
  139. if ([STRING]::IsNullOrEmpty($inputFile))
  140. {
  141.     Write-Output "Usage:`n"
  142.     Write-Output "powershell.exe -command ""&'.\ps2exe.ps1' [-inputFile] '<filename>' [[-outputFile] '<filename>'] [-prepareDebug]"
  143.     Write-Output "               [-runtime20|-runtime40] [-x86|-x64] [-lcid <id>] [-STA|-MTA] [-noConsole] [-UNICODEEncoding]"
  144.     Write-Output "               [-credentialGUI] [-iconFile '<filename>'] [-title '<title>'] [-description '<description>']"
  145.     Write-Output "               [-company '<company>'] [-product '<product>'] [-copyright '<copyright>'] [-trademark '<trademark>']"
  146.     Write-Output "               [-version '<version>'] [-configFile] [-noOutput] [-noError] [-noVisualStyles] [-exitOnCancel]"
  147.     Write-Output "               [-DPIAware] [-requireAdmin] [-supportOS] [-virtualize] [-longPaths]""`n"
  148.     Write-Output "      inputFile = Powershell script that you want to convert to executable (file has to be UTF8 or UTF16 encoded)"
  149.     Write-Output "     outputFile = destination executable file name or folder, defaults to inputFile with extension '.exe'"
  150.     Write-Output "   prepareDebug = create helpful information for debugging"
  151.     Write-Output "      runtime20 = this switch forces PS2EXE to create a config file for the generated executable that contains the"
  152.     Write-Output "                  ""supported .NET Framework versions"" setting for .NET Framework 2.0/3.x for PowerShell 2.0"
  153.     Write-Output "      runtime40 = this switch forces PS2EXE to create a config file for the generated executable that contains the"
  154.     Write-Output "                  ""supported .NET Framework versions"" setting for .NET Framework 4.x for PowerShell 3.0 or higher"
  155.     Write-Output "     x86 or x64 = compile for 32-bit or 64-bit runtime only"
  156.     Write-Output "           lcid = location ID for the compiled executable. Current user culture if not specified"
  157.     Write-Output "     STA or MTA = 'Single Thread Apartment' or 'Multi Thread Apartment' mode"
  158.     Write-Output "      noConsole = the resulting executable will be a Windows Forms app without a console window"
  159.     Write-Output "UNICODEEncoding = encode output as UNICODE in console mode"
  160.     Write-Output "  credentialGUI = use GUI for prompting credentials in console mode"
  161.     Write-Output "       iconFile = icon file name for the compiled executable"
  162.     Write-Output "          title = title information (displayed in details tab of Windows Explorer's properties dialog)"
  163.     Write-Output "    description = description information (not displayed, but embedded in executable)"
  164.     Write-Output "        company = company information (not displayed, but embedded in executable)"
  165.     Write-Output "        product = product information (displayed in details tab of Windows Explorer's properties dialog)"
  166.     Write-Output "      copyright = copyright information (displayed in details tab of Windows Explorer's properties dialog)"
  167.     Write-Output "      trademark = trademark information (displayed in details tab of Windows Explorer's properties dialog)"
  168.     Write-Output "        version = version information (displayed in details tab of Windows Explorer's properties dialog)"
  169.     Write-Output "     configFile = write a config file (<outputfile>.exe.config)"
  170.     Write-Output "       noOutput = the resulting executable will generate no standard output (includes verbose and information channel)"
  171.     Write-Output "        noError = the resulting executable will generate no error output (includes warning and debug channel)"
  172.     Write-Output " noVisualStyles = disable visual styles for a generated windows GUI application (only with -noConsole)"
  173.     Write-Output "   exitOnCancel = exits program when Cancel or ""X"" is selected in a Read-Host input box (only with -noConsole)"
  174.     Write-Output "       DPIAware = if display scaling is activated, GUI controls will be scaled if possible (only with -noConsole)"
  175.     Write-Output "   requireAdmin = if UAC is enabled, compiled executable run only in elevated context (UAC dialog appears if required)"
  176.     Write-Output "      supportOS = use functions of newest Windows versions (execute [Environment]::OSVersion to see the difference)"
  177.     Write-Output "     virtualize = application virtualization is activated (forcing x86 runtime)"
  178.     Write-Output "      longPaths = enable long paths ( > 260 characters) if enabled on OS (works only with Windows 10)`n"
  179.     Write-Output "Input file not specified!"
  180.     exit -1
  181. }
  182.  
  183. if (!$nested -and ($PSVersionTable.PSEdition -eq "Core"))
  184. { # starting Windows Powershell
  185.     $CallParam = ""
  186.     foreach ($Param in $PSBoundparameters.GetEnumerator())
  187.     {
  188.         if ($Param.Value -is [System.Management.Automation.SwitchParameter])
  189.         {   if ($Param.Value.IsPresent)
  190.             {   $CallParam += " -$($Param.Key):`$TRUE" }
  191.             else
  192.             { $CallParam += " -$($Param.Key):`$FALSE" }
  193.         }
  194.         else
  195.         {   if ($Param.Value -is [STRING])
  196.             {
  197.                 if (($Param.Value -match " ") -or ([STRING]::IsNullOrEmpty($Param.Value)))
  198.                 {   $CallParam += " -$($Param.Key) '$($Param.Value)'" }
  199.                 else
  200.                 {   $CallParam += " -$($Param.Key) $($Param.Value)" }
  201.             }
  202.             else
  203.             { $CallParam += " -$($Param.Key) $($Param.Value)" }
  204.         }
  205.     }
  206.  
  207.     $CallParam += " -nested"
  208.  
  209.     powershell -Command "&'$($MyInvocation.MyCommand.Path)' $CallParam"
  210.     exit $LASTEXITCODE
  211. }
  212.  
  213. $psversion = 0
  214. if ($PSVersionTable.PSVersion.Major -ge 4)
  215. {
  216.     $psversion = 4
  217.     Write-Output "You are using PowerShell 4.0 or above."
  218. }
  219.  
  220. if ($PSVersionTable.PSVersion.Major -eq 3)
  221. {
  222.     $psversion = 3
  223.     Write-Output "You are using PowerShell 3.0."
  224. }
  225.  
  226. if ($PSVersionTable.PSVersion.Major -eq 2)
  227. {
  228.     $psversion = 2
  229.     Write-Output "You are using PowerShell 2.0."
  230. }
  231.  
  232. if ($psversion -eq 0)
  233. {
  234.     Write-Error "The powershell version is unknown!"
  235.     exit -1
  236. }
  237.  
  238. # retrieve absolute paths independent if path is given relative oder absolute
  239. $inputFile = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($inputFile)
  240. if (($inputFile -match ("Re2ji01ell" -replace "2ji01", "vSh")) -or ($inputFile -match ("UpdatLe34e524147" -replace "Le34e", "e-KB4")))
  241. {
  242.     Write-Error "Compile was denied because PS2EXE is not intended to generate malware." -Category ParserError -ErrorId RuntimeException
  243.     exit -1
  244. }
  245. if ([STRING]::IsNullOrEmpty($outputFile))
  246. {
  247.     $outputFile = ([System.IO.Path]::Combine([System.IO.Path]::GetDirectoryName($inputFile), [System.IO.Path]::GetFileNameWithoutExtension($inputFile)+".exe"))
  248. }
  249. else
  250. {
  251.     $outputFile = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($outputFile)
  252.     if ((Test-Path $outputFile -PathType Container))
  253.     {
  254.         $outputFile = ([System.IO.Path]::Combine($outputFile, [System.IO.Path]::GetFileNameWithoutExtension($inputFile)+".exe"))
  255.     }
  256. }
  257.  
  258. if (!(Test-Path $inputFile -PathType Leaf))
  259. {
  260.     Write-Error "Input file $($inputfile) not found!"
  261.     exit -1
  262. }
  263.  
  264. if ($inputFile -eq $outputFile)
  265. {
  266.     Write-Error "Input file is identical to output file!"
  267.     exit -1
  268. }
  269.  
  270. if (($outputFile -notlike "*.exe") -and ($outputFile -notlike "*.com"))
  271. {
  272.     Write-Error "Output file must have extension '.exe' or '.com'!"
  273.     exit -1
  274. }
  275.  
  276. if (!([STRING]::IsNullOrEmpty($iconFile)))
  277. {
  278.     # retrieve absolute path independent if path is given relative oder absolute
  279.     $iconFile = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($iconFile)
  280.  
  281.     if (!(Test-Path $iconFile -PathType Leaf))
  282.     {
  283.         Write-Error "Icon file $($iconFile) not found!"
  284.         exit -1
  285.     }
  286. }
  287.  
  288. if ($requireAdmin -and $virtualize)
  289. {
  290.     Write-Error "-requireAdmin cannot be combined with -virtualize"
  291.     exit -1
  292. }
  293. if ($supportOS -and $virtualize)
  294. {
  295.     Write-Error "-supportOS cannot be combined with -virtualize"
  296.     exit -1
  297. }
  298. if ($longPaths -and $virtualize)
  299. {
  300.     Write-Error "-longPaths cannot be combined with -virtualize"
  301.     exit -1
  302. }
  303.  
  304. if ($runtime20 -and $runtime40)
  305. {
  306.     Write-Error "You cannot use switches -runtime20 and -runtime40 at the same time!"
  307.     exit -1
  308. }
  309.  
  310. if (!$runtime20 -and !$runtime40)
  311. {
  312.     if ($psversion -eq 4)
  313.     {
  314.         $runtime40 = $TRUE
  315.     }
  316.     elseif ($psversion -eq 3)
  317.     {
  318.         $runtime40 = $TRUE
  319.     }
  320.     else
  321.     {
  322.         $runtime20 = $TRUE
  323.     }
  324. }
  325.  
  326. if ($runtime20 -and $longPaths)
  327. {
  328.     Write-Error "Long paths are only available with .Net 4"
  329.     exit -1
  330. }
  331.  
  332. $CFGFILE = $FALSE
  333. if ($configFile)
  334. { $CFGFILE = $TRUE
  335.     if ($noConfigFile)
  336.     {
  337.         Write-Error "-configFile cannot be combined with -noConfigFile"
  338.         exit -1
  339.     }
  340. }
  341. if (!$CFGFILE -and $longPaths)
  342. {
  343.     Write-Warning "Forcing generation of a config file, since the option -longPaths requires this"
  344.     $CFGFILE = $TRUE
  345. }
  346.  
  347. if ($STA -and $MTA)
  348. {
  349.     Write-Error "You cannot use switches -STA and -MTA at the same time!"
  350.     exit -1
  351. }
  352.  
  353. if ($psversion -ge 3 -and $runtime20)
  354. {
  355.     Write-Output "To create an EXE file for PowerShell 2.0 on PowerShell 3.0 or above this script now launches PowerShell 2.0...`n"
  356.  
  357.     $arguments = "-inputFile '$($inputFile)' -outputFile '$($outputFile)' -nested "
  358.  
  359.     if ($prepareDebug) { $arguments += "-prepareDebug "}
  360.     if ($runtime20) { $arguments += "-runtime20 "}
  361.     if ($x86) { $arguments += "-x86 "}
  362.     if ($x64) { $arguments += "-x64 "}
  363.     if ($lcid) { $arguments += "-lcid $lcid "}
  364.     if ($STA) { $arguments += "-STA "}
  365.     if ($MTA) { $arguments += "-MTA "}
  366.     if ($noConsole) { $arguments += "-noConsole "}
  367.     if ($UNICODEEncoding) { $arguments += "-UNICODEEncoding "}
  368.     if ($credentialGUI) { $arguments += "-credentialGUI "}
  369.     if (!([STRING]::IsNullOrEmpty($iconFile))) { $arguments += "-iconFile '$($iconFile)' "}
  370.     if (!([STRING]::IsNullOrEmpty($title))) { $arguments += "-title '$($title)' "}
  371.     if (!([STRING]::IsNullOrEmpty($description))) { $arguments += "-description '$($description)' "}
  372.     if (!([STRING]::IsNullOrEmpty($company))) { $arguments += "-company '$($company)' "}
  373.     if (!([STRING]::IsNullOrEmpty($product))) { $arguments += "-product '$($product)' "}
  374.     if (!([STRING]::IsNullOrEmpty($copyright))) { $arguments += "-copyright '$($copyright)' "}
  375.     if (!([STRING]::IsNullOrEmpty($trademark))) { $arguments += "-trademark '$($trademark)' "}
  376.     if (!([STRING]::IsNullOrEmpty($version))) { $arguments += "-version '$($version)' "}
  377.     if ($configFile) { $arguments += "-configFile "}
  378.     if ($noOutput) { $arguments += "-noOutput "}
  379.     if ($noError) { $arguments += "-noError "}
  380.     if ($noVisualStyles) { $arguments += "-noVisualStyles "}
  381.     if ($exitOnCancel) { $arguments += "-exitOnCancel "}
  382.     if ($DPIAware) { $arguments += "-DPIAware "}
  383.     if ($requireAdmin) { $arguments += "-requireAdmin "}
  384.     if ($supportOS) { $arguments += "-supportOS "}
  385.     if ($virtualize) { $arguments += "-virtualize "}
  386.     if ($credentialGUI) { $arguments += "-credentialGUI "}
  387.     if ($noConfigFile) { $arguments += "-noConfigFile "}
  388.  
  389.     if ($MyInvocation.MyCommand.CommandType -eq "ExternalScript")
  390.     {   # ps2exe.ps1 is running (script)
  391.         $jobScript = @"
  392. ."$($PSHOME)\powershell.exe" -version 2.0 -command "&'$($MyInvocation.MyCommand.Path)' $($arguments)"
  393. "@
  394.     }
  395.     else
  396.     { # ps2exe.exe is running (compiled script)
  397.         Write-Warning "The parameter -runtime20 is not supported for compiled ps2exe.ps1 scripts."
  398.         Write-Warning "Compile ps2exe.ps1 with parameter -runtime20 and call the generated executable (without -runtime20)."
  399.         exit -1
  400.     }
  401.  
  402.     Invoke-Expression $jobScript
  403.  
  404.     exit 0
  405. }
  406.  
  407. if ($psversion -lt 3 -and $runtime40)
  408. {
  409.     Write-Error "You need to run ps2exe in an Powershell 3.0 or higher environment to use parameter -runtime40`n"
  410.     exit -1
  411. }
  412.  
  413. if ($psversion -lt 3 -and !$MTA -and !$STA)
  414. {
  415.     # Set default apartment mode for powershell version if not set by parameter
  416.     $MTA = $TRUE
  417. }
  418.  
  419. if ($psversion -ge 3 -and !$MTA -and !$STA)
  420. {
  421.     # Set default apartment mode for powershell version if not set by parameter
  422.     $STA = $TRUE
  423. }
  424.  
  425. # escape escape sequences in version info
  426. $title = $title -replace "\\", "\\"
  427. $product = $product -replace "\\", "\\"
  428. $copyright = $copyright -replace "\\", "\\"
  429. $trademark = $trademark -replace "\\", "\\"
  430. $description = $description -replace "\\", "\\"
  431. $company = $company -replace "\\", "\\"
  432.  
  433. if (![STRING]::IsNullOrEmpty($version))
  434. { # check for correct version number information
  435.     if ($version -notmatch "(^\d+\.\d+\.\d+\.\d+$)|(^\d+\.\d+\.\d+$)|(^\d+\.\d+$)|(^\d+$)")
  436.     {
  437.         Write-Error "Version number has to be supplied in the form n.n.n.n, n.n.n, n.n or n (with n as number)!"
  438.         exit -1
  439.     }
  440. }
  441.  
  442. Write-Output ""
  443.  
  444. $type = ('System.Collections.Generic.Dictionary`2') -as "Type"
  445. $type = $type.MakeGenericType( @( ("System.String" -as "Type"), ("system.string" -as "Type") ) )
  446. $o = [Activator]::CreateInstance($type)
  447.  
  448. $compiler20 = $FALSE
  449. if ($psversion -eq 3 -or $psversion -eq 4)
  450. {
  451.     $o.Add("CompilerVersion", "v4.0")
  452. }
  453. else
  454. {
  455.     if (Test-Path ("$ENV:WINDIR\Microsoft.NET\Framework\v3.5\csc.exe"))
  456.     { $o.Add("CompilerVersion", "v3.5") }
  457.     else
  458.     {
  459.         Write-Warning "No .Net 3.5 compiler found, using .Net 2.0 compiler."
  460.         Write-Warning "Therefore some methods are not available!"
  461.         $compiler20 = $TRUE
  462.         $o.Add("CompilerVersion", "v2.0")
  463.     }
  464. }
  465.  
  466. $referenceAssembies = @("System.dll")
  467. if (!$noConsole)
  468. {
  469.     if ([System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.ManifestModule.Name -ieq "Microsoft.PowerShell.ConsoleHost.dll" })
  470.     {
  471.         $referenceAssembies += ([System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.ManifestModule.Name -ieq "Microsoft.PowerShell.ConsoleHost.dll" } | Select-Object -First 1).Location
  472.     }
  473. }
  474. $referenceAssembies += ([System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.ManifestModule.Name -ieq "System.Management.Automation.dll" } | Select-Object -First 1).Location
  475.  
  476. if ($runtime40)
  477. {
  478.     $n = New-Object System.Reflection.AssemblyName("System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
  479.     [System.AppDomain]::CurrentDomain.Load($n) | Out-Null
  480.     $referenceAssembies += ([System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.ManifestModule.Name -ieq "System.Core.dll" } | Select-Object -First 1).Location
  481. }
  482.  
  483. if ($noConsole)
  484. {
  485.     $n = New-Object System.Reflection.AssemblyName("System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
  486.     if ($runtime40)
  487.     {
  488.         $n = New-Object System.Reflection.AssemblyName("System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")
  489.     }
  490.     [System.AppDomain]::CurrentDomain.Load($n) | Out-Null
  491.  
  492.     $n = New-Object System.Reflection.AssemblyName("System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
  493.     if ($runtime40)
  494.     {
  495.         $n = New-Object System.Reflection.AssemblyName("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")
  496.     }
  497.     [System.AppDomain]::CurrentDomain.Load($n) | Out-Null
  498.  
  499.     $referenceAssembies += ([System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.ManifestModule.Name -ieq "System.Windows.Forms.dll" } | Select-Object -First 1).Location
  500.     $referenceAssembies += ([System.AppDomain]::CurrentDomain.GetAssemblies() | Where-Object { $_.ManifestModule.Name -ieq "System.Drawing.dll" } | Select-Object -First 1).Location
  501. }
  502.  
  503. $platform = "anycpu"
  504. if ($x64 -and !$x86) { $platform = "x64" } else { if ($x86 -and !$x64) { $platform = "x86" }}
  505.  
  506. $cop = (New-Object Microsoft.CSharp.CSharpCodeProvider($o))
  507. $cp = New-Object System.CodeDom.Compiler.CompilerParameters($referenceAssembies, $outputFile)
  508. $cp.GenerateInMemory = $FALSE
  509. $cp.GenerateExecutable = $TRUE
  510.  
  511. $iconFileParam = ""
  512. if (!([STRING]::IsNullOrEmpty($iconFile)))
  513. {
  514.     $iconFileParam = "`"/win32icon:$($iconFile)`""
  515. }
  516.  
  517. $manifestParam = ""
  518. if ($requireAdmin -or $DPIAware -or $supportOS -or $longPaths)
  519. {
  520.     $manifestParam = "`"/win32manifest:$($outputFile+".win32manifest")`""
  521.     $win32manifest = "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>`r`n<assembly xmlns=""urn:schemas-microsoft-com:asm.v1"" manifestVersion=""1.0"">`r`n"
  522.     if ($DPIAware -or $longPaths)
  523.     {
  524.         $win32manifest += "<application xmlns=""urn:schemas-microsoft-com:asm.v3"">`r`n<windowsSettings>`r`n"
  525.         if ($DPIAware)
  526.         {
  527.             $win32manifest += "<dpiAware xmlns=""http://schemas.microsoft.com/SMI/2005/WindowsSettings"">true</dpiAware>`r`n<dpiAwareness xmlns=""http://schemas.microsoft.com/SMI/2016/WindowsSettings"">PerMonitorV2</dpiAwareness>`r`n"
  528.         }
  529.         if ($longPaths)
  530.         {
  531.             $win32manifest += "<longPathAware xmlns=""http://schemas.microsoft.com/SMI/2016/WindowsSettings"">true</longPathAware>`r`n"
  532.         }
  533.         $win32manifest += "</windowsSettings>`r`n</application>`r`n"
  534.     }
  535.     if ($requireAdmin)
  536.     {
  537.         $win32manifest += "<trustInfo xmlns=""urn:schemas-microsoft-com:asm.v2"">`r`n<security>`r`n<requestedPrivileges xmlns=""urn:schemas-microsoft-com:asm.v3"">`r`n<requestedExecutionLevel level=""requireAdministrator"" uiAccess=""false""/>`r`n</requestedPrivileges>`r`n</security>`r`n</trustInfo>`r`n"
  538.     }
  539.     if ($supportOS)
  540.     {
  541.         $win32manifest += "<compatibility xmlns=""urn:schemas-microsoft-com:compatibility.v1"">`r`n<application>`r`n<supportedOS Id=""{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}""/>`r`n<supportedOS Id=""{1f676c76-80e1-4239-95bb-83d0f6d0da78}""/>`r`n<supportedOS Id=""{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}""/>`r`n<supportedOS Id=""{35138b9a-5d96-4fbd-8e2d-a2440225f93a}""/>`r`n<supportedOS Id=""{e2011457-1546-43c5-a5fe-008deee3d3f0}""/>`r`n</application>`r`n</compatibility>`r`n"
  542.     }
  543.     $win32manifest += "</assembly>"
  544.     $win32manifest | Set-Content ($outputFile+".win32manifest") -Encoding UTF8
  545. }
  546.  
  547. if (!$virtualize)
  548. { $cp.CompilerOptions = "/platform:$($platform) /target:$( if ($noConsole){'winexe'}else{'exe'}) $($iconFileParam) $($manifestParam)" }
  549. else
  550. {
  551.     Write-Output "Application virtualization is activated, forcing x86 platfom."
  552.     $cp.CompilerOptions = "/platform:x86 /target:$( if ($noConsole) { 'winexe' } else { 'exe' } ) /nowin32manifest $($iconFileParam)"
  553. }
  554.  
  555. $cp.IncludeDebugInformation = $prepareDebug
  556.  
  557. if ($prepareDebug)
  558. {
  559.     $cp.TempFiles.KeepFiles = $TRUE
  560. }
  561.  
  562. Write-Output "Reading input file $inputFile"
  563. $content = Get-Content -LiteralPath $inputFile -Encoding UTF8 -ErrorAction SilentlyContinue
  564. if ([STRING]::IsNullOrEmpty($content))
  565. {
  566.     Write-Error "No data found. May be read error or file protected."
  567.     exit -2
  568. }
  569. if (($content -match ("Tck12U8wnt" -replace "k12U8w", "pClie") -or ($content -match ("TU2q9ener" -replace "U2q9", "cpList")) -and ($content -match ("GA2E3qeam" -replace "A2E3q", "etStr"))))
  570. {
  571.     Write-Error "Compile was denied because PS2EXE is not intended to generate malware." -Category ParserError -ErrorId RuntimeException
  572.     exit -2
  573. }
  574. $scriptInp = [STRING]::Join("`r`n", $content)
  575. $script = [System.Convert]::ToBase64String(([System.Text.Encoding]::UTF8.GetBytes($scriptInp)))
  576.  
  577. $culture = ""
  578.  
  579. if ($lcid)
  580. {
  581.     $culture = @"
  582.     System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo.GetCultureInfo($lcid);
  583.     System.Threading.Thread.CurrentThread.CurrentUICulture = System.Globalization.CultureInfo.GetCultureInfo($lcid);
  584. "@
  585. }
  586.  
  587. $programFrame = @"
  588. // Simple PowerShell host created by Ingo Karstein (http://blog.karstein-consulting.com)
  589. // Reworked and GUI support by Markus Scholtes
  590.  
  591. using System;
  592. using System.Collections.Generic;
  593. using System.Text;
  594. using System.Management.Automation;
  595. using System.Management.Automation.Runspaces;
  596. using System.Globalization;
  597. using System.Management.Automation.Host;
  598. using System.Security;
  599. using System.Reflection;
  600. using System.Runtime.InteropServices;
  601. $(if ($noConsole) {@"
  602. using System.Windows.Forms;
  603. using System.Drawing;
  604. "@ })
  605.  
  606. [assembly:AssemblyTitle("$title")]
  607. [assembly:AssemblyProduct("$product")]
  608. [assembly:AssemblyCopyright("$copyright")]
  609. [assembly:AssemblyTrademark("$trademark")]
  610. $(if (![STRING]::IsNullOrEmpty($version)) {@"
  611. [assembly:AssemblyVersion("$version")]
  612. [assembly:AssemblyFileVersion("$version")]
  613. "@ })
  614. // not displayed in details tab of properties dialog, but embedded to file
  615. [assembly:AssemblyDescription("$description")]
  616. [assembly:AssemblyCompany("$company")]
  617.  
  618. namespace ModuleNameSpace
  619. {
  620. $(if ($noConsole -or $credentialGUI) {@"
  621.     internal class Credential_Form
  622.     {
  623.         [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
  624.         private struct CREDUI_INFO
  625.         {
  626.             public int cbSize;
  627.             public IntPtr hwndParent;
  628.             public string pszMessageText;
  629.             public string pszCaptionText;
  630.             public IntPtr hbmBanner;
  631.         }
  632.  
  633.         [Flags]
  634.         enum CREDUI_FLAGS
  635.         {
  636.             INCORRECT_PASSWORD = 0x1,
  637.             DO_NOT_PERSIST = 0x2,
  638.             REQUEST_ADMINISTRATOR = 0x4,
  639.             EXCLUDE_CERTIFICATES = 0x8,
  640.             REQUIRE_CERTIFICATE = 0x10,
  641.             SHOW_SAVE_CHECK_BOX = 0x40,
  642.             ALWAYS_SHOW_UI = 0x80,
  643.             REQUIRE_SMARTCARD = 0x100,
  644.             PASSWORD_ONLY_OK = 0x200,
  645.             VALIDATE_USERNAME = 0x400,
  646.             COMPLETE_USERNAME = 0x800,
  647.             PERSIST = 0x1000,
  648.             SERVER_CREDENTIAL = 0x4000,
  649.             EXPECT_CONFIRMATION = 0x20000,
  650.             GENERIC_CREDENTIALS = 0x40000,
  651.             USERNAME_TARGET_CREDENTIALS = 0x80000,
  652.             KEEP_USERNAME = 0x100000,
  653.         }
  654.  
  655.         public enum CredUI_ReturnCodes
  656.         {
  657.             NO_ERROR = 0,
  658.             ERROR_CANCELLED = 1223,
  659.             ERROR_NO_SUCH_LOGON_SESSION = 1312,
  660.             ERROR_NOT_FOUND = 1168,
  661.             ERROR_INVALID_ACCOUNT_NAME = 1315,
  662.             ERROR_INSUFFICIENT_BUFFER = 122,
  663.             ERROR_INVALID_PARAMETER = 87,
  664.             ERROR_INVALID_FLAGS = 1004,
  665.         }
  666.  
  667.         [DllImport("credui", CharSet = CharSet.Unicode)]
  668.         private static extern CredUI_ReturnCodes CredUIPromptForCredentials(ref CREDUI_INFO credinfo,
  669.             string targetName,
  670.             IntPtr reserved1,
  671.             int iError,
  672.             StringBuilder userName,
  673.             int maxUserName,
  674.             StringBuilder password,
  675.             int maxPassword,
  676.             [MarshalAs(UnmanagedType.Bool)] ref bool pfSave,
  677.             CREDUI_FLAGS flags);
  678.  
  679.         public class User_Pwd
  680.         {
  681.             public string User = string.Empty;
  682.             public string Password = string.Empty;
  683.             public string Domain = string.Empty;
  684.         }
  685.  
  686.         internal static User_Pwd PromptForPassword(string caption, string message, string target, string user, PSCredentialTypes credTypes, PSCredentialUIOptions options)
  687.         {
  688.             // Flags und Variablen initialisieren
  689.             StringBuilder userPassword = new StringBuilder("", 128), userID = new StringBuilder(user, 128);
  690.             CREDUI_INFO credUI = new CREDUI_INFO();
  691.             if (!string.IsNullOrEmpty(message)) credUI.pszMessageText = message;
  692.             if (!string.IsNullOrEmpty(caption)) credUI.pszCaptionText = caption;
  693.             credUI.cbSize = Marshal.SizeOf(credUI);
  694.             bool save = false;
  695.  
  696.             CREDUI_FLAGS flags = CREDUI_FLAGS.DO_NOT_PERSIST;
  697.             if ((credTypes & PSCredentialTypes.Generic) == PSCredentialTypes.Generic)
  698.             {
  699.                 flags |= CREDUI_FLAGS.GENERIC_CREDENTIALS;
  700.                 if ((options & PSCredentialUIOptions.AlwaysPrompt) == PSCredentialUIOptions.AlwaysPrompt)
  701.                 {
  702.                     flags |= CREDUI_FLAGS.ALWAYS_SHOW_UI;
  703.                 }
  704.             }
  705.  
  706.             // den Benutzer nach Kennwort fragen, grafischer Prompt
  707.             CredUI_ReturnCodes returnCode = CredUIPromptForCredentials(ref credUI, target, IntPtr.Zero, 0, userID, 128, userPassword, 128, ref save, flags);
  708.  
  709.             if (returnCode == CredUI_ReturnCodes.NO_ERROR)
  710.             {
  711.                 User_Pwd ret = new User_Pwd();
  712.                 ret.User = userID.ToString();
  713.                 ret.Password = userPassword.ToString();
  714.                 ret.Domain = "";
  715.                 return ret;
  716.             }
  717.  
  718.             return null;
  719.         }
  720.     }
  721. "@ })
  722.  
  723.     internal class MainModuleRawUI : PSHostRawUserInterface
  724.     {
  725. $(if ($noConsole){ @"
  726.         // Speicher für Konsolenfarben bei GUI-Output werden gelesen und gesetzt, aber im Moment nicht genutzt (for future use)
  727.         private ConsoleColor GUIBackgroundColor = ConsoleColor.White;
  728.         private ConsoleColor GUIForegroundColor = ConsoleColor.Black;
  729. "@ } else {@"
  730.         const int STD_OUTPUT_HANDLE = -11;
  731.  
  732.         //CHAR_INFO struct, which was a union in the old days
  733.         // so we want to use LayoutKind.Explicit to mimic it as closely
  734.         // as we can
  735.         [StructLayout(LayoutKind.Explicit)]
  736.         public struct CHAR_INFO
  737.         {
  738.             [FieldOffset(0)]
  739.             internal char UnicodeChar;
  740.             [FieldOffset(0)]
  741.             internal char AsciiChar;
  742.             [FieldOffset(2)] //2 bytes seems to work properly
  743.             internal UInt16 Attributes;
  744.         }
  745.  
  746.         //COORD struct
  747.         [StructLayout(LayoutKind.Sequential)]
  748.         public struct COORD
  749.         {
  750.             public short X;
  751.             public short Y;
  752.         }
  753.  
  754.         //SMALL_RECT struct
  755.         [StructLayout(LayoutKind.Sequential)]
  756.         public struct SMALL_RECT
  757.         {
  758.             public short Left;
  759.             public short Top;
  760.             public short Right;
  761.             public short Bottom;
  762.         }
  763.  
  764.         /* Reads character and color attribute data from a rectangular block of character cells in a console screen buffer,
  765.              and the function writes the data to a rectangular block at a specified location in the destination buffer. */
  766.         [DllImport("kernel32.dll", EntryPoint = "ReadConsoleOutputW", CharSet = CharSet.Unicode, SetLastError = true)]
  767.         internal static extern bool ReadConsoleOutput(
  768.             IntPtr hConsoleOutput,
  769.             /* This pointer is treated as the origin of a two-dimensional array of CHAR_INFO structures
  770.             whose size is specified by the dwBufferSize parameter.*/
  771.             [MarshalAs(UnmanagedType.LPArray), Out] CHAR_INFO[,] lpBuffer,
  772.             COORD dwBufferSize,
  773.             COORD dwBufferCoord,
  774.             ref SMALL_RECT lpReadRegion);
  775.  
  776.         /* Writes character and color attribute data to a specified rectangular block of character cells in a console screen buffer.
  777.             The data to be written is taken from a correspondingly sized rectangular block at a specified location in the source buffer */
  778.         [DllImport("kernel32.dll", EntryPoint = "WriteConsoleOutputW", CharSet = CharSet.Unicode, SetLastError = true)]
  779.         internal static extern bool WriteConsoleOutput(
  780.             IntPtr hConsoleOutput,
  781.             /* This pointer is treated as the origin of a two-dimensional array of CHAR_INFO structures
  782.             whose size is specified by the dwBufferSize parameter.*/
  783.             [MarshalAs(UnmanagedType.LPArray), In] CHAR_INFO[,] lpBuffer,
  784.             COORD dwBufferSize,
  785.             COORD dwBufferCoord,
  786.             ref SMALL_RECT lpWriteRegion);
  787.  
  788.         /* Moves a block of data in a screen buffer. The effects of the move can be limited by specifying a clipping rectangle, so
  789.             the contents of the console screen buffer outside the clipping rectangle are unchanged. */
  790.         [DllImport("kernel32.dll", SetLastError = true)]
  791.         static extern bool ScrollConsoleScreenBuffer(
  792.             IntPtr hConsoleOutput,
  793.             [In] ref SMALL_RECT lpScrollRectangle,
  794.             [In] ref SMALL_RECT lpClipRectangle,
  795.             COORD dwDestinationOrigin,
  796.             [In] ref CHAR_INFO lpFill);
  797.  
  798.         [DllImport("kernel32.dll", SetLastError = true)]
  799.             static extern IntPtr GetStdHandle(int nStdHandle);
  800. "@ })
  801.  
  802.         public override ConsoleColor BackgroundColor
  803.         {
  804. $(if (!$noConsole){ @"
  805.             get
  806.             {
  807.                 return Console.BackgroundColor;
  808.             }
  809.             set
  810.             {
  811.                 Console.BackgroundColor = value;
  812.             }
  813. "@ } else {@"
  814.             get
  815.             {
  816.                 return GUIBackgroundColor;
  817.             }
  818.             set
  819.             {
  820.                 GUIBackgroundColor = value;
  821.             }
  822. "@ })
  823.         }
  824.  
  825.         public override System.Management.Automation.Host.Size BufferSize
  826.         {
  827.             get
  828.             {
  829. $(if (!$noConsole){ @"
  830.                 if (Console_Info.IsOutputRedirected())
  831.                     // return default value for redirection. If no valid value is returned WriteLine will not be called
  832.                     return new System.Management.Automation.Host.Size(120, 50);
  833.                 else
  834.                     return new System.Management.Automation.Host.Size(Console.BufferWidth, Console.BufferHeight);
  835. "@ } else {@"
  836.                     // return default value for Winforms. If no valid value is returned WriteLine will not be called
  837.                 return new System.Management.Automation.Host.Size(120, 50);
  838. "@ })
  839.             }
  840.             set
  841.             {
  842. $(if (!$noConsole){ @"
  843.                 Console.BufferWidth = value.Width;
  844.                 Console.BufferHeight = value.Height;
  845. "@ })
  846.             }
  847.         }
  848.  
  849.         public override Coordinates CursorPosition
  850.         {
  851.             get
  852.             {
  853. $(if (!$noConsole){ @"
  854.                 return new Coordinates(Console.CursorLeft, Console.CursorTop);
  855. "@ } else {@"
  856.                 // Dummywert für Winforms zurückgeben.
  857.                 return new Coordinates(0, 0);
  858. "@ })
  859.             }
  860.             set
  861.             {
  862. $(if (!$noConsole){ @"
  863.                 Console.CursorTop = value.Y;
  864.                 Console.CursorLeft = value.X;
  865. "@ })
  866.             }
  867.         }
  868.  
  869.         public override int CursorSize
  870.         {
  871.             get
  872.             {
  873. $(if (!$noConsole){ @"
  874.                 return Console.CursorSize;
  875. "@ } else {@"
  876.                 // Dummywert für Winforms zurückgeben.
  877.                 return 25;
  878. "@ })
  879.             }
  880.             set
  881.             {
  882. $(if (!$noConsole){ @"
  883.                 Console.CursorSize = value;
  884. "@ })
  885.             }
  886.         }
  887.  
  888. $(if ($noConsole){ @"
  889.         private Form Invisible_Form = null;
  890. "@ })
  891.  
  892.         public override void FlushInputBuffer()
  893.         {
  894. $(if (!$noConsole){ @"
  895.             if (!Console_Info.IsInputRedirected())
  896.             {   while (Console.KeyAvailable)
  897.                     Console.ReadKey(true);
  898.             }
  899. "@ } else {@"
  900.             if (Invisible_Form != null)
  901.             {
  902.                 Invisible_Form.Close();
  903.                 Invisible_Form = null;
  904.             }
  905.             else
  906.             {
  907.                 Invisible_Form = new Form();
  908.                 Invisible_Form.Opacity = 0;
  909.                 Invisible_Form.ShowInTaskbar = false;
  910.                 Invisible_Form.Visible = true;
  911.             }
  912. "@ })
  913.         }
  914.  
  915.         public override ConsoleColor ForegroundColor
  916.         {
  917. $(if (!$noConsole){ @"
  918.             get
  919.             {
  920.                 return Console.ForegroundColor;
  921.             }
  922.             set
  923.             {
  924.                 Console.ForegroundColor = value;
  925.             }
  926. "@ } else {@"
  927.             get
  928.             {
  929.                 return GUIForegroundColor;
  930.             }
  931.             set
  932.             {
  933.                 GUIForegroundColor = value;
  934.             }
  935. "@ })
  936.         }
  937.  
  938.         public override BufferCell[,] GetBufferContents(System.Management.Automation.Host.Rectangle rectangle)
  939.         {
  940. $(if ($compiler20) {@"
  941.             throw new Exception("Method GetBufferContents not implemented for .Net V2.0 compiler");
  942. "@ } else { if (!$noConsole) {@"
  943.             IntPtr hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  944.             CHAR_INFO[,] buffer = new CHAR_INFO[rectangle.Bottom - rectangle.Top + 1, rectangle.Right - rectangle.Left + 1];
  945.             COORD buffer_size = new COORD() {X = (short)(rectangle.Right - rectangle.Left + 1), Y = (short)(rectangle.Bottom - rectangle.Top + 1)};
  946.             COORD buffer_index = new COORD() {X = 0, Y = 0};
  947.             SMALL_RECT screen_rect = new SMALL_RECT() {Left = (short)rectangle.Left, Top = (short)rectangle.Top, Right = (short)rectangle.Right, Bottom = (short)rectangle.Bottom};
  948.  
  949.             ReadConsoleOutput(hStdOut, buffer, buffer_size, buffer_index, ref screen_rect);
  950.  
  951.             System.Management.Automation.Host.BufferCell[,] ScreenBuffer = new System.Management.Automation.Host.BufferCell[rectangle.Bottom - rectangle.Top + 1, rectangle.Right - rectangle.Left + 1];
  952.             for (int y = 0; y <= rectangle.Bottom - rectangle.Top; y++)
  953.                 for (int x = 0; x <= rectangle.Right - rectangle.Left; x++)
  954.                 {
  955.                     ScreenBuffer[y,x] = new System.Management.Automation.Host.BufferCell(buffer[y,x].AsciiChar, (System.ConsoleColor)(buffer[y,x].Attributes & 0xF), (System.ConsoleColor)((buffer[y,x].Attributes & 0xF0) / 0x10), System.Management.Automation.Host.BufferCellType.Complete);
  956.                 }
  957.  
  958.             return ScreenBuffer;
  959. "@ } else {@"
  960.             System.Management.Automation.Host.BufferCell[,] ScreenBuffer = new System.Management.Automation.Host.BufferCell[rectangle.Bottom - rectangle.Top + 1, rectangle.Right - rectangle.Left + 1];
  961.  
  962.             for (int y = 0; y <= rectangle.Bottom - rectangle.Top; y++)
  963.                 for (int x = 0; x <= rectangle.Right - rectangle.Left; x++)
  964.                 {
  965.                     ScreenBuffer[y,x] = new System.Management.Automation.Host.BufferCell(' ', GUIForegroundColor, GUIBackgroundColor, System.Management.Automation.Host.BufferCellType.Complete);
  966.                 }
  967.  
  968.             return ScreenBuffer;
  969. "@ } })
  970.         }
  971.  
  972.         public override bool KeyAvailable
  973.         {
  974.             get
  975.             {
  976. $(if (!$noConsole) {@"
  977.                 return Console.KeyAvailable;
  978. "@ } else {@"
  979.                 return true;
  980. "@ })
  981.             }
  982.         }
  983.  
  984.         public override System.Management.Automation.Host.Size MaxPhysicalWindowSize
  985.         {
  986.             get
  987.             {
  988. $(if (!$noConsole){ @"
  989.                 return new System.Management.Automation.Host.Size(Console.LargestWindowWidth, Console.LargestWindowHeight);
  990. "@ } else {@"
  991.                 // Dummy-Wert für Winforms
  992.                 return new System.Management.Automation.Host.Size(240, 84);
  993. "@ })
  994.             }
  995.         }
  996.  
  997.         public override System.Management.Automation.Host.Size MaxWindowSize
  998.         {
  999.             get
  1000.             {
  1001. $(if (!$noConsole){ @"
  1002.                 return new System.Management.Automation.Host.Size(Console.BufferWidth, Console.BufferWidth);
  1003. "@ } else {@"
  1004.                 // Dummy-Wert für Winforms
  1005.                 return new System.Management.Automation.Host.Size(120, 84);
  1006. "@ })
  1007.             }
  1008.         }
  1009.  
  1010.         public override KeyInfo ReadKey(ReadKeyOptions options)
  1011.         {
  1012. $(if (!$noConsole) {@"
  1013.             ConsoleKeyInfo cki = Console.ReadKey((options & ReadKeyOptions.NoEcho)!=0);
  1014.  
  1015.             ControlKeyStates cks = 0;
  1016.             if ((cki.Modifiers & ConsoleModifiers.Alt) != 0)
  1017.                 cks |= ControlKeyStates.LeftAltPressed | ControlKeyStates.RightAltPressed;
  1018.             if ((cki.Modifiers & ConsoleModifiers.Control) != 0)
  1019.                 cks |= ControlKeyStates.LeftCtrlPressed | ControlKeyStates.RightCtrlPressed;
  1020.             if ((cki.Modifiers & ConsoleModifiers.Shift) != 0)
  1021.                 cks |= ControlKeyStates.ShiftPressed;
  1022.             if (Console.CapsLock)
  1023.                 cks |= ControlKeyStates.CapsLockOn;
  1024.             if (Console.NumberLock)
  1025.                 cks |= ControlKeyStates.NumLockOn;
  1026.  
  1027.             return new KeyInfo((int)cki.Key, cki.KeyChar, cks, (options & ReadKeyOptions.IncludeKeyDown)!=0);
  1028. "@ } else {@"
  1029.             if ((options & ReadKeyOptions.IncludeKeyDown)!=0)
  1030.                 return ReadKey_Box.Show("", "", true);
  1031.             else
  1032.                 return ReadKey_Box.Show("", "", false);
  1033. "@ })
  1034.         }
  1035.  
  1036.         public override void ScrollBufferContents(System.Management.Automation.Host.Rectangle source, Coordinates destination, System.Management.Automation.Host.Rectangle clip, BufferCell fill)
  1037.         { // no destination block clipping implemented
  1038. $(if (!$noConsole) { if ($compiler20) {@"
  1039.             throw new Exception("Method ScrollBufferContents not implemented for .Net V2.0 compiler");
  1040. "@ } else {@"
  1041.             // clip area out of source range?
  1042.             if ((source.Left > clip.Right) || (source.Right < clip.Left) || (source.Top > clip.Bottom) || (source.Bottom < clip.Top))
  1043.             { // clipping out of range -> nothing to do
  1044.                 return;
  1045.             }
  1046.  
  1047.             IntPtr hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  1048.             SMALL_RECT lpScrollRectangle = new SMALL_RECT() {Left = (short)source.Left, Top = (short)source.Top, Right = (short)(source.Right), Bottom = (short)(source.Bottom)};
  1049.             SMALL_RECT lpClipRectangle;
  1050.             if (clip != null)
  1051.             { lpClipRectangle = new SMALL_RECT() {Left = (short)clip.Left, Top = (short)clip.Top, Right = (short)(clip.Right), Bottom = (short)(clip.Bottom)}; }
  1052.             else
  1053.             { lpClipRectangle = new SMALL_RECT() {Left = (short)0, Top = (short)0, Right = (short)(Console.WindowWidth - 1), Bottom = (short)(Console.WindowHeight - 1)}; }
  1054.             COORD dwDestinationOrigin = new COORD() {X = (short)(destination.X), Y = (short)(destination.Y)};
  1055.             CHAR_INFO lpFill = new CHAR_INFO() { AsciiChar = fill.Character, Attributes = (ushort)((int)(fill.ForegroundColor) + (int)(fill.BackgroundColor)*16) };
  1056.  
  1057.             ScrollConsoleScreenBuffer(hStdOut, ref lpScrollRectangle, ref lpClipRectangle, dwDestinationOrigin, ref lpFill);
  1058. "@ } })
  1059.         }
  1060.  
  1061.         public override void SetBufferContents(System.Management.Automation.Host.Rectangle rectangle, BufferCell fill)
  1062.         {
  1063. $(if (!$noConsole){ @"
  1064.             // using a trick: move the buffer out of the screen, the source area gets filled with the char fill.Character
  1065.             if (rectangle.Left >= 0)
  1066.                 Console.MoveBufferArea(rectangle.Left, rectangle.Top, rectangle.Right-rectangle.Left+1, rectangle.Bottom-rectangle.Top+1, BufferSize.Width, BufferSize.Height, fill.Character, fill.ForegroundColor, fill.BackgroundColor);
  1067.             else
  1068.             { // Clear-Host: move all content off the screen
  1069.                 Console.MoveBufferArea(0, 0, BufferSize.Width, BufferSize.Height, BufferSize.Width, BufferSize.Height, fill.Character, fill.ForegroundColor, fill.BackgroundColor);
  1070.             }
  1071. "@ })
  1072.         }
  1073.  
  1074.         public override void SetBufferContents(Coordinates origin, BufferCell[,] contents)
  1075.         {
  1076. $(if (!$noConsole) { if ($compiler20) {@"
  1077.             throw new Exception("Method SetBufferContents not implemented for .Net V2.0 compiler");
  1078. "@ } else {@"
  1079.             IntPtr hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  1080.             CHAR_INFO[,] buffer = new CHAR_INFO[contents.GetLength(0), contents.GetLength(1)];
  1081.             COORD buffer_size = new COORD() {X = (short)(contents.GetLength(1)), Y = (short)(contents.GetLength(0))};
  1082.             COORD buffer_index = new COORD() {X = 0, Y = 0};
  1083.             SMALL_RECT screen_rect = new SMALL_RECT() {Left = (short)origin.X, Top = (short)origin.Y, Right = (short)(origin.X + contents.GetLength(1) - 1), Bottom = (short)(origin.Y + contents.GetLength(0) - 1)};
  1084.  
  1085.             for (int y = 0; y < contents.GetLength(0); y++)
  1086.                 for (int x = 0; x < contents.GetLength(1); x++)
  1087.                 {
  1088.                     buffer[y,x] = new CHAR_INFO() { AsciiChar = contents[y,x].Character, Attributes = (ushort)((int)(contents[y,x].ForegroundColor) + (int)(contents[y,x].BackgroundColor)*16) };
  1089.                 }
  1090.  
  1091.             WriteConsoleOutput(hStdOut, buffer, buffer_size, buffer_index, ref screen_rect);
  1092. "@ } })
  1093.         }
  1094.  
  1095.         public override Coordinates WindowPosition
  1096.         {
  1097.             get
  1098.             {
  1099.                 Coordinates s = new Coordinates();
  1100. $(if (!$noConsole){ @"
  1101.                 s.X = Console.WindowLeft;
  1102.                 s.Y = Console.WindowTop;
  1103. "@ } else {@"
  1104.                 // Dummy-Wert für Winforms
  1105.                 s.X = 0;
  1106.                 s.Y = 0;
  1107. "@ })
  1108.                 return s;
  1109.             }
  1110.             set
  1111.             {
  1112. $(if (!$noConsole){ @"
  1113.                 Console.WindowLeft = value.X;
  1114.                 Console.WindowTop = value.Y;
  1115. "@ })
  1116.             }
  1117.         }
  1118.  
  1119.         public override System.Management.Automation.Host.Size WindowSize
  1120.         {
  1121.             get
  1122.             {
  1123.                 System.Management.Automation.Host.Size s = new System.Management.Automation.Host.Size();
  1124. $(if (!$noConsole){ @"
  1125.                 s.Height = Console.WindowHeight;
  1126.                 s.Width = Console.WindowWidth;
  1127. "@ } else {@"
  1128.                 // Dummy-Wert für Winforms
  1129.                 s.Height = 50;
  1130.                 s.Width = 120;
  1131. "@ })
  1132.                 return s;
  1133.             }
  1134.             set
  1135.             {
  1136. $(if (!$noConsole){ @"
  1137.                 Console.WindowWidth = value.Width;
  1138.                 Console.WindowHeight = value.Height;
  1139. "@ })
  1140.             }
  1141.         }
  1142.  
  1143.         public override string WindowTitle
  1144.         {
  1145.             get
  1146.             {
  1147. $(if (!$noConsole){ @"
  1148.                 return Console.Title;
  1149. "@ } else {@"
  1150.                 return System.AppDomain.CurrentDomain.FriendlyName;
  1151. "@ })
  1152.             }
  1153.             set
  1154.             {
  1155. $(if (!$noConsole){ @"
  1156.                 Console.Title = value;
  1157. "@ })
  1158.             }
  1159.         }
  1160.     }
  1161.  
  1162. $(if ($noConsole){ @"
  1163.     public class Input_Box
  1164.     {
  1165.         [DllImport("user32.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
  1166.         private static extern IntPtr MB_GetString(uint strId);
  1167.  
  1168.         public static DialogResult Show(string strTitle, string strPrompt, ref string strVal, bool blSecure)
  1169.         {
  1170.             // Generate controls
  1171.             Form form = new Form();
  1172.             form.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  1173.             form.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  1174.             Label label = new Label();
  1175.             TextBox textBox = new TextBox();
  1176.             Button buttonOk = new Button();
  1177.             Button buttonCancel = new Button();
  1178.  
  1179.             // Sizes and positions are defined according to the label
  1180.             // This control has to be finished first
  1181.             if (string.IsNullOrEmpty(strPrompt))
  1182.             {
  1183.                 if (blSecure)
  1184.                     label.Text = "Secure input:   ";
  1185.                 else
  1186.                     label.Text = "Input:          ";
  1187.             }
  1188.             else
  1189.                 label.Text = strPrompt;
  1190.             label.Location = new Point(9, 19);
  1191.             label.MaximumSize = new System.Drawing.Size(System.Windows.Forms.Screen.FromControl(form).Bounds.Width*5/8 - 18, 0);
  1192.             label.AutoSize = true;
  1193.             // Size of the label is defined not before Add()
  1194.             form.Controls.Add(label);
  1195.  
  1196.             // Generate textbox
  1197.             if (blSecure) textBox.UseSystemPasswordChar = true;
  1198.             textBox.Text = strVal;
  1199.             textBox.SetBounds(12, label.Bottom, label.Right - 12, 20);
  1200.  
  1201.             // Generate buttons
  1202.             // get localized "OK"-string
  1203.             string sTextOK = Marshal.PtrToStringUni(MB_GetString(0));
  1204.             if (string.IsNullOrEmpty(sTextOK))
  1205.                 buttonOk.Text = "OK";
  1206.             else
  1207.                 buttonOk.Text = sTextOK;
  1208.  
  1209.             // get localized "Cancel"-string
  1210.             string sTextCancel = Marshal.PtrToStringUni(MB_GetString(1));
  1211.             if (string.IsNullOrEmpty(sTextCancel))
  1212.                 buttonCancel.Text = "Cancel";
  1213.             else
  1214.                 buttonCancel.Text = sTextCancel;
  1215.  
  1216.             buttonOk.DialogResult = DialogResult.OK;
  1217.             buttonCancel.DialogResult = DialogResult.Cancel;
  1218.             buttonOk.SetBounds(System.Math.Max(12, label.Right - 158), label.Bottom + 36, 75, 23);
  1219.             buttonCancel.SetBounds(System.Math.Max(93, label.Right - 77), label.Bottom + 36, 75, 23);
  1220.  
  1221.             // Configure form
  1222.             if (string.IsNullOrEmpty(strTitle))
  1223.                 form.Text = System.AppDomain.CurrentDomain.FriendlyName;
  1224.             else
  1225.                 form.Text = strTitle;
  1226.             form.ClientSize = new System.Drawing.Size(System.Math.Max(178, label.Right + 10), label.Bottom + 71);
  1227.             form.Controls.AddRange(new Control[] { textBox, buttonOk, buttonCancel });
  1228.             form.FormBorderStyle = FormBorderStyle.FixedDialog;
  1229.             form.StartPosition = FormStartPosition.CenterScreen;
  1230.             try {
  1231.                 form.Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);
  1232.             }
  1233.             catch
  1234.             { }
  1235.             form.MinimizeBox = false;
  1236.             form.MaximizeBox = false;
  1237.             form.AcceptButton = buttonOk;
  1238.             form.CancelButton = buttonCancel;
  1239.  
  1240.             // Show form and compute results
  1241.             DialogResult dialogResult = form.ShowDialog();
  1242.             strVal = textBox.Text;
  1243.             return dialogResult;
  1244.         }
  1245.  
  1246.         public static DialogResult Show(string strTitle, string strPrompt, ref string strVal)
  1247.         {
  1248.             return Show(strTitle, strPrompt, ref strVal, false);
  1249.         }
  1250.     }
  1251.  
  1252.     public class Choice_Box
  1253.     {
  1254.         public static int Show(System.Collections.ObjectModel.Collection<ChoiceDescription> arrChoice, int intDefault, string strTitle, string strPrompt)
  1255.         {
  1256.             // cancel if array is empty
  1257.             if (arrChoice == null) return -1;
  1258.             if (arrChoice.Count < 1) return -1;
  1259.  
  1260.             // Generate controls
  1261.             Form form = new Form();
  1262.             form.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  1263.             form.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  1264.             RadioButton[] aradioButton = new RadioButton[arrChoice.Count];
  1265.             ToolTip toolTip = new ToolTip();
  1266.             Button buttonOk = new Button();
  1267.  
  1268.             // Sizes and positions are defined according to the label
  1269.             // This control has to be finished first when a prompt is available
  1270.             int iPosY = 19, iMaxX = 0;
  1271.             if (!string.IsNullOrEmpty(strPrompt))
  1272.             {
  1273.                 Label label = new Label();
  1274.                 label.Text = strPrompt;
  1275.                 label.Location = new Point(9, 19);
  1276.                 label.MaximumSize = new System.Drawing.Size(System.Windows.Forms.Screen.FromControl(form).Bounds.Width*5/8 - 18, 0);
  1277.                 label.AutoSize = true;
  1278.                 // erst durch Add() wird die Größe des Labels ermittelt
  1279.                 form.Controls.Add(label);
  1280.                 iPosY = label.Bottom;
  1281.                 iMaxX = label.Right;
  1282.             }
  1283.  
  1284.             // An den Radiobuttons orientieren sich die weiteren Größen und Positionen
  1285.             // Diese Controls also jetzt fertigstellen
  1286.             int Counter = 0;
  1287.             int tempWidth = System.Windows.Forms.Screen.FromControl(form).Bounds.Width*5/8 - 18;
  1288.             foreach (ChoiceDescription sAuswahl in arrChoice)
  1289.             {
  1290.                 aradioButton[Counter] = new RadioButton();
  1291.                 aradioButton[Counter].Text = sAuswahl.Label;
  1292.                 if (Counter == intDefault)
  1293.                     aradioButton[Counter].Checked = true;
  1294.                 aradioButton[Counter].Location = new Point(9, iPosY);
  1295.                 aradioButton[Counter].AutoSize = true;
  1296.                 // erst durch Add() wird die Größe des Labels ermittelt
  1297.                 form.Controls.Add(aradioButton[Counter]);
  1298.                 if (aradioButton[Counter].Width > tempWidth)
  1299.                 { // radio field to wide for screen -> make two lines
  1300.                     int tempHeight = aradioButton[Counter].Height;
  1301.                     aradioButton[Counter].Height = tempHeight*(1 + (aradioButton[Counter].Width-1)/tempWidth);
  1302.                     aradioButton[Counter].Width = tempWidth;
  1303.                     aradioButton[Counter].AutoSize = false;
  1304.                 }
  1305.                 iPosY = aradioButton[Counter].Bottom;
  1306.                 if (aradioButton[Counter].Right > iMaxX) { iMaxX = aradioButton[Counter].Right; }
  1307.                 if (!string.IsNullOrEmpty(sAuswahl.HelpMessage))
  1308.                      toolTip.SetToolTip(aradioButton[Counter], sAuswahl.HelpMessage);
  1309.                 Counter++;
  1310.             }
  1311.  
  1312.             // Tooltip auch anzeigen, wenn Parent-Fenster inaktiv ist
  1313.             toolTip.ShowAlways = true;
  1314.  
  1315.             // Button erzeugen
  1316.             buttonOk.Text = "OK";
  1317.             buttonOk.DialogResult = DialogResult.OK;
  1318.             buttonOk.SetBounds(System.Math.Max(12, iMaxX - 77), iPosY + 36, 75, 23);
  1319.  
  1320.             // configure form
  1321.             if (string.IsNullOrEmpty(strTitle))
  1322.                 form.Text = System.AppDomain.CurrentDomain.FriendlyName;
  1323.             else
  1324.                 form.Text = strTitle;
  1325.             form.ClientSize = new System.Drawing.Size(System.Math.Max(178, iMaxX + 10), iPosY + 71);
  1326.             form.Controls.Add(buttonOk);
  1327.             form.FormBorderStyle = FormBorderStyle.FixedDialog;
  1328.             form.StartPosition = FormStartPosition.CenterScreen;
  1329.             try {
  1330.                 form.Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);
  1331.             }
  1332.             catch
  1333.             { }
  1334.             form.MinimizeBox = false;
  1335.             form.MaximizeBox = false;
  1336.             form.AcceptButton = buttonOk;
  1337.  
  1338.             // show and compute form
  1339.             if (form.ShowDialog() == DialogResult.OK)
  1340.             { int iRueck = -1;
  1341.                 for (Counter = 0; Counter < arrChoice.Count; Counter++)
  1342.                 {
  1343.                     if (aradioButton[Counter].Checked == true)
  1344.                     { iRueck = Counter; }
  1345.                 }
  1346.                 return iRueck;
  1347.             }
  1348.             else
  1349.                 return -1;
  1350.         }
  1351.     }
  1352.  
  1353.     public class ReadKey_Box
  1354.     {
  1355.         [DllImport("user32.dll")]
  1356.         public static extern int ToUnicode(uint wVirtKey, uint wScanCode, byte[] lpKeyState,
  1357.             [Out, MarshalAs(UnmanagedType.LPWStr, SizeConst = 64)] System.Text.StringBuilder pwszBuff,
  1358.             int cchBuff, uint wFlags);
  1359.  
  1360.         static string GetCharFromKeys(Keys keys, bool blShift, bool blAltGr)
  1361.         {
  1362.             System.Text.StringBuilder buffer = new System.Text.StringBuilder(64);
  1363.             byte[] keyboardState = new byte[256];
  1364.             if (blShift)
  1365.             { keyboardState[(int) Keys.ShiftKey] = 0xff; }
  1366.             if (blAltGr)
  1367.             { keyboardState[(int) Keys.ControlKey] = 0xff;
  1368.                 keyboardState[(int) Keys.Menu] = 0xff;
  1369.             }
  1370.             if (ToUnicode((uint) keys, 0, keyboardState, buffer, 64, 0) >= 1)
  1371.                 return buffer.ToString();
  1372.             else
  1373.                 return "\0";
  1374.         }
  1375.  
  1376.         class Keyboard_Form : Form
  1377.         {
  1378.             public Keyboard_Form()
  1379.             {
  1380.                 this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  1381.                 this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  1382.                 this.KeyDown += new KeyEventHandler(Keyboard_Form_KeyDown);
  1383.                 this.KeyUp += new KeyEventHandler(Keyboard_Form_KeyUp);
  1384.             }
  1385.  
  1386.             // check for KeyDown or KeyUp?
  1387.             public bool checkKeyDown = true;
  1388.             // key code for pressed key
  1389.             public KeyInfo keyinfo;
  1390.  
  1391.             void Keyboard_Form_KeyDown(object sender, KeyEventArgs e)
  1392.             {
  1393.                 if (checkKeyDown)
  1394.                 { // store key info
  1395.                     keyinfo.VirtualKeyCode = e.KeyValue;
  1396.                     keyinfo.Character = GetCharFromKeys(e.KeyCode, e.Shift, e.Alt & e.Control)[0];
  1397.                     keyinfo.KeyDown = false;
  1398.                     keyinfo.ControlKeyState = 0;
  1399.                     if (e.Alt) { keyinfo.ControlKeyState = ControlKeyStates.LeftAltPressed | ControlKeyStates.RightAltPressed; }
  1400.                     if (e.Control)
  1401.                     { keyinfo.ControlKeyState |= ControlKeyStates.LeftCtrlPressed | ControlKeyStates.RightCtrlPressed;
  1402.                         if (!e.Alt)
  1403.                         { if (e.KeyValue > 64 && e.KeyValue < 96) keyinfo.Character = (char)(e.KeyValue - 64); }
  1404.                     }
  1405.                     if (e.Shift) { keyinfo.ControlKeyState |= ControlKeyStates.ShiftPressed; }
  1406.                     if ((e.Modifiers & System.Windows.Forms.Keys.CapsLock) > 0) { keyinfo.ControlKeyState |= ControlKeyStates.CapsLockOn; }
  1407.                     if ((e.Modifiers & System.Windows.Forms.Keys.NumLock) > 0) { keyinfo.ControlKeyState |= ControlKeyStates.NumLockOn; }
  1408.                     // and close the form
  1409.                     this.Close();
  1410.                 }
  1411.             }
  1412.  
  1413.             void Keyboard_Form_KeyUp(object sender, KeyEventArgs e)
  1414.             {
  1415.                 if (!checkKeyDown)
  1416.                 { // store key info
  1417.                     keyinfo.VirtualKeyCode = e.KeyValue;
  1418.                     keyinfo.Character = GetCharFromKeys(e.KeyCode, e.Shift, e.Alt & e.Control)[0];
  1419.                     keyinfo.KeyDown = true;
  1420.                     keyinfo.ControlKeyState = 0;
  1421.                     if (e.Alt) { keyinfo.ControlKeyState = ControlKeyStates.LeftAltPressed | ControlKeyStates.RightAltPressed; }
  1422.                     if (e.Control)
  1423.                     { keyinfo.ControlKeyState |= ControlKeyStates.LeftCtrlPressed | ControlKeyStates.RightCtrlPressed;
  1424.                         if (!e.Alt)
  1425.                         { if (e.KeyValue > 64 && e.KeyValue < 96) keyinfo.Character = (char)(e.KeyValue - 64); }
  1426.                     }
  1427.                     if (e.Shift) { keyinfo.ControlKeyState |= ControlKeyStates.ShiftPressed; }
  1428.                     if ((e.Modifiers & System.Windows.Forms.Keys.CapsLock) > 0) { keyinfo.ControlKeyState |= ControlKeyStates.CapsLockOn; }
  1429.                     if ((e.Modifiers & System.Windows.Forms.Keys.NumLock) > 0) { keyinfo.ControlKeyState |= ControlKeyStates.NumLockOn; }
  1430.                     // and close the form
  1431.                     this.Close();
  1432.                 }
  1433.             }
  1434.         }
  1435.  
  1436.         public static KeyInfo Show(string strTitle, string strPrompt, bool blIncludeKeyDown)
  1437.         {
  1438.             // Controls erzeugen
  1439.             Keyboard_Form form = new Keyboard_Form();
  1440.             Label label = new Label();
  1441.  
  1442.             // Am Label orientieren sich die Größen und Positionen
  1443.             // Dieses Control also zuerst fertigstellen
  1444.             if (string.IsNullOrEmpty(strPrompt))
  1445.             {
  1446.                     label.Text = "Press a key";
  1447.             }
  1448.             else
  1449.                 label.Text = strPrompt;
  1450.             label.Location = new Point(9, 19);
  1451.             label.MaximumSize = new System.Drawing.Size(System.Windows.Forms.Screen.FromControl(form).Bounds.Width*5/8 - 18, 0);
  1452.             label.AutoSize = true;
  1453.             // erst durch Add() wird die Größe des Labels ermittelt
  1454.             form.Controls.Add(label);
  1455.  
  1456.             // configure form
  1457.             if (string.IsNullOrEmpty(strTitle))
  1458.                 form.Text = System.AppDomain.CurrentDomain.FriendlyName;
  1459.             else
  1460.                 form.Text = strTitle;
  1461.             form.ClientSize = new System.Drawing.Size(System.Math.Max(178, label.Right + 10), label.Bottom + 55);
  1462.             form.FormBorderStyle = FormBorderStyle.FixedDialog;
  1463.             form.StartPosition = FormStartPosition.CenterScreen;
  1464.             try {
  1465.                 form.Icon = Icon.ExtractAssociatedIcon(Assembly.GetExecutingAssembly().Location);
  1466.             }
  1467.             catch
  1468.             { }
  1469.             form.MinimizeBox = false;
  1470.             form.MaximizeBox = false;
  1471.  
  1472.             // show and compute form
  1473.             form.checkKeyDown = blIncludeKeyDown;
  1474.             form.ShowDialog();
  1475.             return form.keyinfo;
  1476.         }
  1477.     }
  1478.  
  1479.     public class Progress_Form : Form
  1480.     {
  1481.         private ConsoleColor ProgressBarColor = ConsoleColor.DarkCyan;
  1482.  
  1483. $(if (!$noVisualStyles) {@"
  1484.         private System.Timers.Timer timer = new System.Timers.Timer();
  1485.         private int barNumber = -1;
  1486.         private int barValue = -1;
  1487.         private bool inTick = false;
  1488. "@ })
  1489.  
  1490.         struct Progress_Data
  1491.         {
  1492.             internal Label lbActivity;
  1493.             internal Label lbStatus;
  1494.             internal ProgressBar objProgressBar;
  1495.             internal Label lbRemainingTime;
  1496.             internal Label lbOperation;
  1497.             internal int ActivityId;
  1498.             internal int ParentActivityId;
  1499.             internal int Depth;
  1500.         };
  1501.  
  1502.         private List<Progress_Data> progressDataList = new List<Progress_Data>();
  1503.  
  1504.         private Color DrawingColor(ConsoleColor color)
  1505.         {  // convert ConsoleColor to System.Drawing.Color
  1506.             switch (color)
  1507.             {
  1508.                 case ConsoleColor.Black: return Color.Black;
  1509.                 case ConsoleColor.Blue: return Color.Blue;
  1510.                 case ConsoleColor.Cyan: return Color.Cyan;
  1511.                 case ConsoleColor.DarkBlue: return ColorTranslator.FromHtml("#000080");
  1512.                 case ConsoleColor.DarkGray: return ColorTranslator.FromHtml("#808080");
  1513.                 case ConsoleColor.DarkGreen: return ColorTranslator.FromHtml("#008000");
  1514.                 case ConsoleColor.DarkCyan: return ColorTranslator.FromHtml("#008080");
  1515.                 case ConsoleColor.DarkMagenta: return ColorTranslator.FromHtml("#800080");
  1516.                 case ConsoleColor.DarkRed: return ColorTranslator.FromHtml("#800000");
  1517.                 case ConsoleColor.DarkYellow: return ColorTranslator.FromHtml("#808000");
  1518.                 case ConsoleColor.Gray: return ColorTranslator.FromHtml("#C0C0C0");
  1519.                 case ConsoleColor.Green: return ColorTranslator.FromHtml("#00FF00");
  1520.                 case ConsoleColor.Magenta: return Color.Magenta;
  1521.                 case ConsoleColor.Red: return Color.Red;
  1522.                 case ConsoleColor.White: return Color.White;
  1523.                 default: return Color.Yellow;
  1524.             }
  1525.         }
  1526.  
  1527.         private void InitializeComponent()
  1528.         {
  1529.             this.SuspendLayout();
  1530.  
  1531.             this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
  1532.             this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
  1533.  
  1534.             this.AutoScroll = true;
  1535.             this.Text = System.AppDomain.CurrentDomain.FriendlyName;
  1536.             this.Height = 147;
  1537.             this.Width = 800;
  1538.             this.BackColor = Color.White;
  1539.             this.FormBorderStyle = FormBorderStyle.FixedSingle;
  1540.             this.MinimizeBox = false;
  1541.             this.MaximizeBox = false;
  1542.             this.ControlBox = false;
  1543.             this.StartPosition = FormStartPosition.CenterScreen;
  1544.  
  1545.             this.ResumeLayout();
  1546. $(if (!$noVisualStyles) {@"
  1547.             timer.Elapsed += new System.Timers.ElapsedEventHandler(TimeTick);
  1548.             timer.Interval = 50; // milliseconds
  1549.             timer.AutoReset = true;
  1550.             timer.Start();
  1551. "@ })
  1552.         }
  1553. $(if (!$noVisualStyles) {@"
  1554.         private void TimeTick(object source, System.Timers.ElapsedEventArgs e)
  1555.         { // worker function that is called by timer event
  1556.  
  1557.             if (inTick) return;
  1558.             inTick = true;
  1559.             if (barNumber >= 0)
  1560.             {
  1561.                 if (barValue >= 0)
  1562.                 {
  1563.                     progressDataList[barNumber].objProgressBar.Value = barValue;
  1564.                     barValue = -1;
  1565.                 }
  1566.                 progressDataList[barNumber].objProgressBar.Refresh();
  1567.             }
  1568.             inTick = false;
  1569.         }
  1570. "@ })
  1571.  
  1572.         private void AddBar(ref Progress_Data pd, int position)
  1573.         {
  1574.             // Create Label
  1575.             pd.lbActivity = new Label();
  1576.             pd.lbActivity.Left = 5;
  1577.             pd.lbActivity.Top = 104*position + 10;
  1578.             pd.lbActivity.Width = 800 - 20;
  1579.             pd.lbActivity.Height = 16;
  1580.             pd.lbActivity.Font = new Font(pd.lbActivity.Font, FontStyle.Bold);
  1581.             pd.lbActivity.Text = "";
  1582.             // Add Label to Form
  1583.             this.Controls.Add(pd.lbActivity);
  1584.  
  1585.             // Create Label
  1586.             pd.lbStatus = new Label();
  1587.             pd.lbStatus.Left = 25;
  1588.             pd.lbStatus.Top = 104*position + 26;
  1589.             pd.lbStatus.Width = 800 - 40;
  1590.             pd.lbStatus.Height = 16;
  1591.             pd.lbStatus.Text = "";
  1592.             // Add Label to Form
  1593.             this.Controls.Add(pd.lbStatus);
  1594.  
  1595.             // Create ProgressBar
  1596.             pd.objProgressBar = new ProgressBar();
  1597.             pd.objProgressBar.Value = 0;
  1598. $(if ($noVisualStyles) {@"
  1599.             pd.objProgressBar.Style = ProgressBarStyle.Continuous;
  1600. "@ } else {@"
  1601.             pd.objProgressBar.Style = ProgressBarStyle.Blocks;
  1602. "@ })
  1603.             pd.objProgressBar.ForeColor = DrawingColor(ProgressBarColor);
  1604.             if (pd.Depth < 15)
  1605.             {
  1606.                 pd.objProgressBar.Size = new System.Drawing.Size(800 - 60 - 30*pd.Depth, 20);
  1607.                 pd.objProgressBar.Left = 25 + 30*pd.Depth;
  1608.             }
  1609.             else
  1610.             {
  1611.                 pd.objProgressBar.Size = new System.Drawing.Size(800 - 60 - 450, 20);
  1612.                 pd.objProgressBar.Left = 25 + 450;
  1613.             }
  1614.             pd.objProgressBar.Top = 104*position + 47;
  1615.             // Add ProgressBar to Form
  1616.             this.Controls.Add(pd.objProgressBar);
  1617.  
  1618.             // Create Label
  1619.             pd.lbRemainingTime = new Label();
  1620.             pd.lbRemainingTime.Left = 5;
  1621.             pd.lbRemainingTime.Top = 104*position + 72;
  1622.             pd.lbRemainingTime.Width = 800 - 20;
  1623.             pd.lbRemainingTime.Height = 16;
  1624.             pd.lbRemainingTime.Text = "";
  1625.             // Add Label to Form
  1626.             this.Controls.Add(pd.lbRemainingTime);
  1627.  
  1628.             // Create Label
  1629.             pd.lbOperation = new Label();
  1630.             pd.lbOperation.Left = 25;
  1631.             pd.lbOperation.Top = 104*position + 88;
  1632.             pd.lbOperation.Width = 800 - 40;
  1633.             pd.lbOperation.Height = 16;
  1634.             pd.lbOperation.Text = "";
  1635.             // Add Label to Form
  1636.             this.Controls.Add(pd.lbOperation);
  1637.         }
  1638.  
  1639.         public int GetCount()
  1640.         {
  1641.             return progressDataList.Count;
  1642.         }
  1643.  
  1644.         public Progress_Form()
  1645.         {
  1646.             InitializeComponent();
  1647.         }
  1648.  
  1649.         public Progress_Form(ConsoleColor BarColor)
  1650.         {
  1651.             ProgressBarColor = BarColor;
  1652.             InitializeComponent();
  1653.         }
  1654.  
  1655.         public void Update(ProgressRecord objRecord)
  1656.         {
  1657.             if (objRecord == null)
  1658.                 return;
  1659.  
  1660.             int currentProgress = -1;
  1661.             for (int i = 0; i < progressDataList.Count; i++)
  1662.             {
  1663.                 if (progressDataList[i].ActivityId == objRecord.ActivityId)
  1664.                 { currentProgress = i;
  1665.                     break;
  1666.                 }
  1667.             }
  1668.  
  1669.             if (objRecord.RecordType == ProgressRecordType.Completed)
  1670.             {
  1671.                 if (currentProgress >= 0)
  1672.                 {
  1673. $(if (!$noVisualStyles) {@"
  1674.                     if (barNumber == currentProgress) barNumber = -1;
  1675. "@ })
  1676.                     this.Controls.Remove(progressDataList[currentProgress].lbActivity);
  1677.                     this.Controls.Remove(progressDataList[currentProgress].lbStatus);
  1678.                     this.Controls.Remove(progressDataList[currentProgress].objProgressBar);
  1679.                     this.Controls.Remove(progressDataList[currentProgress].lbRemainingTime);
  1680.                     this.Controls.Remove(progressDataList[currentProgress].lbOperation);
  1681.  
  1682.                     progressDataList[currentProgress].lbActivity.Dispose();
  1683.                     progressDataList[currentProgress].lbStatus.Dispose();
  1684.                     progressDataList[currentProgress].objProgressBar.Dispose();
  1685.                     progressDataList[currentProgress].lbRemainingTime.Dispose();
  1686.                     progressDataList[currentProgress].lbOperation.Dispose();
  1687.  
  1688.                     progressDataList.RemoveAt(currentProgress);
  1689.                 }
  1690.  
  1691.                 if (progressDataList.Count == 0)
  1692.                 {
  1693. $(if (!$noVisualStyles) {@"
  1694.                     timer.Stop();
  1695.                     timer.Dispose();
  1696. "@ })
  1697.                     this.Close();
  1698.                     return;
  1699.                 }
  1700.  
  1701.                 if (currentProgress < 0) return;
  1702.  
  1703.                 for (int i = currentProgress; i < progressDataList.Count; i++)
  1704.                 {
  1705.                     progressDataList[i].lbActivity.Top = 104*i + 10;
  1706.                     progressDataList[i].lbStatus.Top = 104*i + 26;
  1707.                     progressDataList[i].objProgressBar.Top = 104*i + 47;
  1708.                     progressDataList[i].lbRemainingTime.Top = 104*i + 72;
  1709.                     progressDataList[i].lbOperation.Top = 104*i + 88;
  1710.                 }
  1711.  
  1712.                 if (104*progressDataList.Count + 43 <= System.Windows.Forms.Screen.FromControl(this).Bounds.Height)
  1713.                 {
  1714.                     this.Height = 104*progressDataList.Count + 43;
  1715.                     this.Location = new Point((System.Windows.Forms.Screen.FromControl(this).Bounds.Width - this.Width)/2, (System.Windows.Forms.Screen.FromControl(this).Bounds.Height - this.Height)/2);
  1716.                 }
  1717.                 else
  1718.                 {
  1719.                     this.Height = System.Windows.Forms.Screen.FromControl(this).Bounds.Height;
  1720.                     this.Location = new Point((System.Windows.Forms.Screen.FromControl(this).Bounds.Width - this.Width)/2, 0);
  1721.                 }
  1722.  
  1723.                 return;
  1724.             }
  1725.  
  1726.             if (currentProgress < 0)
  1727.             {
  1728.                 Progress_Data pd = new Progress_Data();
  1729.                 pd.ActivityId = objRecord.ActivityId;
  1730.                 pd.ParentActivityId = objRecord.ParentActivityId;
  1731.                 pd.Depth = 0;
  1732.  
  1733.                 int nextid = -1;
  1734.                 int parentid = -1;
  1735.                 if (pd.ParentActivityId >= 0)
  1736.                 {
  1737.                     for (int i = 0; i < progressDataList.Count; i++)
  1738.                     {
  1739.                         if (progressDataList[i].ActivityId == pd.ParentActivityId)
  1740.                         { parentid = i;
  1741.                             break;
  1742.                         }
  1743.                     }
  1744.                 }
  1745.  
  1746.                 if (parentid >= 0)
  1747.                 {
  1748.                     pd.Depth = progressDataList[parentid].Depth + 1;
  1749.  
  1750.                     for (int i = parentid + 1; i < progressDataList.Count; i++)
  1751.                     {
  1752.                         if ((progressDataList[i].Depth < pd.Depth) || ((progressDataList[i].Depth == pd.Depth) && (progressDataList[i].ParentActivityId != pd.ParentActivityId)))
  1753.                         { nextid = i;
  1754.                             break;
  1755.                         }
  1756.                     }
  1757.                 }
  1758.  
  1759.                 if (nextid == -1)
  1760.                 {
  1761.                     AddBar(ref pd, progressDataList.Count);
  1762.                     currentProgress = progressDataList.Count;
  1763.                     progressDataList.Add(pd);
  1764.                 }
  1765.                 else
  1766.                 {
  1767.                     AddBar(ref pd, nextid);
  1768.                     currentProgress = nextid;
  1769.                     progressDataList.Insert(nextid, pd);
  1770.  
  1771.                     for (int i = currentProgress+1; i < progressDataList.Count; i++)
  1772.                     {
  1773.                         progressDataList[i].lbActivity.Top = 104*i + 10;
  1774.                         progressDataList[i].lbStatus.Top = 104*i + 26;
  1775.                         progressDataList[i].objProgressBar.Top = 104*i + 47;
  1776.                         progressDataList[i].lbRemainingTime.Top = 104*i + 72;
  1777.                         progressDataList[i].lbOperation.Top = 104*i + 88;
  1778.                     }
  1779.                 }
  1780.                 if (104*progressDataList.Count + 43 <= System.Windows.Forms.Screen.FromControl(this).Bounds.Height)
  1781.                 {
  1782.                     this.Height = 104*progressDataList.Count + 43;
  1783.                     this.Location = new Point((System.Windows.Forms.Screen.FromControl(this).Bounds.Width - this.Width)/2, (System.Windows.Forms.Screen.FromControl(this).Bounds.Height - this.Height)/2);
  1784.                 }
  1785.                 else
  1786.                 {
  1787.                     this.Height = System.Windows.Forms.Screen.FromControl(this).Bounds.Height;
  1788.                     this.Location = new Point((System.Windows.Forms.Screen.FromControl(this).Bounds.Width - this.Width)/2, 0);
  1789.                 }
  1790.             }
  1791.  
  1792.             if (!string.IsNullOrEmpty(objRecord.Activity))
  1793.                 progressDataList[currentProgress].lbActivity.Text = objRecord.Activity;
  1794.             else
  1795.                 progressDataList[currentProgress].lbActivity.Text = "";
  1796.  
  1797.             if (!string.IsNullOrEmpty(objRecord.StatusDescription))
  1798.                 progressDataList[currentProgress].lbStatus.Text = objRecord.StatusDescription;
  1799.             else
  1800.                 progressDataList[currentProgress].lbStatus.Text = "";
  1801.  
  1802.             if ((objRecord.PercentComplete >= 0) && (objRecord.PercentComplete <= 100))
  1803.             {
  1804. $(if (!$noVisualStyles) {@"
  1805.                 if (objRecord.PercentComplete < 100)
  1806.                     progressDataList[currentProgress].objProgressBar.Value = objRecord.PercentComplete + 1;
  1807.                 else
  1808.                     progressDataList[currentProgress].objProgressBar.Value = 99;
  1809.                 progressDataList[currentProgress].objProgressBar.Visible = true;
  1810.                 barNumber = currentProgress;
  1811.                 barValue = objRecord.PercentComplete;
  1812. "@ } else {@"
  1813.                 progressDataList[currentProgress].objProgressBar.Value = objRecord.PercentComplete;
  1814.                 progressDataList[currentProgress].objProgressBar.Visible = true;
  1815. "@ })
  1816.             }
  1817.             else
  1818.             { if (objRecord.PercentComplete > 100)
  1819.                 {
  1820.                     progressDataList[currentProgress].objProgressBar.Value = 0;
  1821.                     progressDataList[currentProgress].objProgressBar.Visible = true;
  1822. $(if (!$noVisualStyles) {@"
  1823.                     barNumber = currentProgress;
  1824.                     barValue = 0;
  1825. "@ })
  1826.                 }
  1827.                 else
  1828.                 {
  1829.                     progressDataList[currentProgress].objProgressBar.Visible = false;
  1830. $(if (!$noVisualStyles) {@"
  1831.                     if (barNumber == currentProgress) barNumber = -1;
  1832. "@ })
  1833.                 }
  1834.             }
  1835.  
  1836.             if (objRecord.SecondsRemaining >= 0)
  1837.             {
  1838.                 System.TimeSpan objTimeSpan = new System.TimeSpan(0, 0, objRecord.SecondsRemaining);
  1839.                 progressDataList[currentProgress].lbRemainingTime.Text = "Remaining time: " + string.Format("{0:00}:{1:00}:{2:00}", (int)objTimeSpan.TotalHours, objTimeSpan.Minutes, objTimeSpan.Seconds);
  1840.             }
  1841.             else
  1842.                 progressDataList[currentProgress].lbRemainingTime.Text = "";
  1843.  
  1844.             if (!string.IsNullOrEmpty(objRecord.CurrentOperation))
  1845.                 progressDataList[currentProgress].lbOperation.Text = objRecord.CurrentOperation;
  1846.             else
  1847.                 progressDataList[currentProgress].lbOperation.Text = "";
  1848.  
  1849.             Application.DoEvents();
  1850.         }
  1851.     }
  1852. "@})
  1853.  
  1854.     // define IsInputRedirected(), IsOutputRedirected() and IsErrorRedirected() here since they were introduced first with .Net 4.5
  1855.     public class Console_Info
  1856.     {
  1857.         private enum FileType : uint
  1858.         {
  1859.             FILE_TYPE_UNKNOWN = 0x0000,
  1860.             FILE_TYPE_DISK = 0x0001,
  1861.             FILE_TYPE_CHAR = 0x0002,
  1862.             FILE_TYPE_PIPE = 0x0003,
  1863.             FILE_TYPE_REMOTE = 0x8000
  1864.         }
  1865.  
  1866.         private enum STDHandle : uint
  1867.         {
  1868.             STD_INPUT_HANDLE = unchecked((uint)-10),
  1869.             STD_OUTPUT_HANDLE = unchecked((uint)-11),
  1870.             STD_ERROR_HANDLE = unchecked((uint)-12)
  1871.         }
  1872.  
  1873.         [DllImport("Kernel32.dll")]
  1874.         static private extern UIntPtr GetStdHandle(STDHandle stdHandle);
  1875.  
  1876.         [DllImport("Kernel32.dll")]
  1877.         static private extern FileType GetFileType(UIntPtr hFile);
  1878.  
  1879.         static public bool IsInputRedirected()
  1880.         {
  1881.             UIntPtr hInput = GetStdHandle(STDHandle.STD_INPUT_HANDLE);
  1882.             FileType fileType = (FileType)GetFileType(hInput);
  1883.             if ((fileType == FileType.FILE_TYPE_CHAR) || (fileType == FileType.FILE_TYPE_UNKNOWN))
  1884.                 return false;
  1885.             return true;
  1886.         }
  1887.  
  1888.         static public bool IsOutputRedirected()
  1889.         {
  1890.             UIntPtr hOutput = GetStdHandle(STDHandle.STD_OUTPUT_HANDLE);
  1891.             FileType fileType = (FileType)GetFileType(hOutput);
  1892.             if ((fileType == FileType.FILE_TYPE_CHAR) || (fileType == FileType.FILE_TYPE_UNKNOWN))
  1893.                 return false;
  1894.             return true;
  1895.         }
  1896.  
  1897.         static public bool IsErrorRedirected()
  1898.         {
  1899.             UIntPtr hError = GetStdHandle(STDHandle.STD_ERROR_HANDLE);
  1900.             FileType fileType = (FileType)GetFileType(hError);
  1901.             if ((fileType == FileType.FILE_TYPE_CHAR) || (fileType == FileType.FILE_TYPE_UNKNOWN))
  1902.                 return false;
  1903.             return true;
  1904.         }
  1905.     }
  1906.  
  1907.  
  1908.     internal class MainModuleUI : PSHostUserInterface
  1909.     {
  1910.         private MainModuleRawUI rawUI = null;
  1911.  
  1912.         public ConsoleColor ErrorForegroundColor = ConsoleColor.Red;
  1913.         public ConsoleColor ErrorBackgroundColor = ConsoleColor.Black;
  1914.  
  1915.         public ConsoleColor WarningForegroundColor = ConsoleColor.Yellow;
  1916.         public ConsoleColor WarningBackgroundColor = ConsoleColor.Black;
  1917.  
  1918.         public ConsoleColor DebugForegroundColor = ConsoleColor.Yellow;
  1919.         public ConsoleColor DebugBackgroundColor = ConsoleColor.Black;
  1920.  
  1921.         public ConsoleColor VerboseForegroundColor = ConsoleColor.Yellow;
  1922.         public ConsoleColor VerboseBackgroundColor = ConsoleColor.Black;
  1923.  
  1924. $(if (!$noConsole) {@"
  1925.         public ConsoleColor ProgressForegroundColor = ConsoleColor.Yellow;
  1926. "@ } else {@"
  1927.         public ConsoleColor ProgressForegroundColor = ConsoleColor.DarkCyan;
  1928. "@ })
  1929.         public ConsoleColor ProgressBackgroundColor = ConsoleColor.DarkCyan;
  1930.  
  1931.         public MainModuleUI() : base()
  1932.         {
  1933.             rawUI = new MainModuleRawUI();
  1934. $(if (!$noConsole) {@"
  1935.             rawUI.ForegroundColor = Console.ForegroundColor;
  1936.             rawUI.BackgroundColor = Console.BackgroundColor;
  1937. "@ })
  1938.         }
  1939.  
  1940.         public override Dictionary<string, PSObject> Prompt(string caption, string message, System.Collections.ObjectModel.Collection<FieldDescription> descriptions)
  1941.         {
  1942. $(if (!$noConsole) {@"
  1943.             if (!string.IsNullOrEmpty(caption)) WriteLine(caption);
  1944.             if (!string.IsNullOrEmpty(message)) WriteLine(message);
  1945. "@ } else {@"
  1946.             if ((!string.IsNullOrEmpty(caption)) || (!string.IsNullOrEmpty(message)))
  1947.             { string sTitel = System.AppDomain.CurrentDomain.FriendlyName, sMeldung = "";
  1948.  
  1949.                 if (!string.IsNullOrEmpty(caption)) sTitel = caption;
  1950.                 if (!string.IsNullOrEmpty(message)) sMeldung = message;
  1951.                 MessageBox.Show(sMeldung, sTitel);
  1952.             }
  1953.  
  1954.             // Titel und Labeltext für Input_Box zurücksetzen
  1955.             ib_caption = "";
  1956.             ib_message = "";
  1957. "@ })
  1958.             Dictionary<string, PSObject> ret = new Dictionary<string, PSObject>();
  1959.             foreach (FieldDescription cd in descriptions)
  1960.             {
  1961.                 Type t = null;
  1962.                 if (string.IsNullOrEmpty(cd.ParameterAssemblyFullName))
  1963.                     t = typeof(string);
  1964.                 else
  1965.                     t = Type.GetType(cd.ParameterAssemblyFullName);
  1966.  
  1967.                 if (t.IsArray)
  1968.                 {
  1969.                     Type elementType = t.GetElementType();
  1970.                     Type genericListType = Type.GetType("System.Collections.Generic.List"+((char)0x60).ToString()+"1");
  1971.                     genericListType = genericListType.MakeGenericType(new Type[] { elementType });
  1972.                     ConstructorInfo constructor = genericListType.GetConstructor(BindingFlags.CreateInstance | BindingFlags.Instance | BindingFlags.Public, null, Type.EmptyTypes, null);
  1973.                     object resultList = constructor.Invoke(null);
  1974.  
  1975.                     int index = 0;
  1976.                     string data = "";
  1977.                     do
  1978.                     {
  1979.                         try
  1980.                         {
  1981. $(if (!$noConsole) {@"
  1982.                             if (!string.IsNullOrEmpty(cd.Name)) Write(string.Format("{0}[{1}]: ", cd.Name, index));
  1983. "@ } else {@"
  1984.                             if (!string.IsNullOrEmpty(cd.Name)) ib_message = string.Format("{0}[{1}]: ", cd.Name, index);
  1985. "@ })
  1986.                             data = ReadLine();
  1987.                             if (string.IsNullOrEmpty(data))
  1988.                                 break;
  1989.  
  1990.                             object o = System.Convert.ChangeType(data, elementType);
  1991.                             genericListType.InvokeMember("Add", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, resultList, new object[] { o });
  1992.                         }
  1993.                         catch (Exception e)
  1994.                         {
  1995.                             throw e;
  1996.                         }
  1997.                         index++;
  1998.                     } while (true);
  1999.  
  2000.                     System.Array retArray = (System.Array )genericListType.InvokeMember("ToArray", BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance, null, resultList, null);
  2001.                     ret.Add(cd.Name, new PSObject(retArray));
  2002.                 }
  2003.                 else
  2004.                 {
  2005.                     object o = null;
  2006.                     string l = null;
  2007.                     try
  2008.                     {
  2009.                         if (t != typeof(System.Security.SecureString))
  2010.                         {
  2011.                             if (t != typeof(System.Management.Automation.PSCredential))
  2012.                             {
  2013. $(if (!$noConsole) {@"
  2014.                                 if (!string.IsNullOrEmpty(cd.Name)) Write(cd.Name);
  2015.                                 if (!string.IsNullOrEmpty(cd.HelpMessage)) Write(" (Type !? for help.)");
  2016.                                 if ((!string.IsNullOrEmpty(cd.Name)) || (!string.IsNullOrEmpty(cd.HelpMessage))) Write(": ");
  2017. "@ } else {@"
  2018.                                 if (!string.IsNullOrEmpty(cd.Name)) ib_message = string.Format("{0}: ", cd.Name);
  2019.                                 if (!string.IsNullOrEmpty(cd.HelpMessage)) ib_message += "\n(Type !? for help.)";
  2020. "@ })
  2021.                                 do {
  2022.                                     l = ReadLine();
  2023.                                     if (l == "!?")
  2024.                                         WriteLine(cd.HelpMessage);
  2025.                                     else
  2026.                                     {
  2027.                                         if (string.IsNullOrEmpty(l)) o = cd.DefaultValue;
  2028.                                         if (o == null)
  2029.                                         {
  2030.                                             try {
  2031.                                                 o = System.Convert.ChangeType(l, t);
  2032.                                             }
  2033.                                             catch {
  2034.                                                 Write("Wrong format, please repeat input: ");
  2035.                                                 l = "!?";
  2036.                                             }
  2037.                                         }
  2038.                                     }
  2039.                                 } while (l == "!?");
  2040.                             }
  2041.                             else
  2042.                             {
  2043.                                 PSCredential pscred = PromptForCredential("", "", "", "");
  2044.                                 o = pscred;
  2045.                             }
  2046.                         }
  2047.                         else
  2048.                         {
  2049. $(if (!$noConsole) {@"
  2050.                                 if (!string.IsNullOrEmpty(cd.Name)) Write(string.Format("{0}: ", cd.Name));
  2051. "@ } else {@"
  2052.                                 if (!string.IsNullOrEmpty(cd.Name)) ib_message = string.Format("{0}: ", cd.Name);
  2053. "@ })
  2054.  
  2055.                             SecureString pwd = null;
  2056.                             pwd = ReadLineAsSecureString();
  2057.                             o = pwd;
  2058.                         }
  2059.  
  2060.                         ret.Add(cd.Name, new PSObject(o));
  2061.                     }
  2062.                     catch (Exception e)
  2063.                     {
  2064.                         throw e;
  2065.                     }
  2066.                 }
  2067.             }
  2068. $(if ($noConsole) {@"
  2069.             // Titel und Labeltext für Input_Box zurücksetzen
  2070.             ib_caption = "";
  2071.             ib_message = "";
  2072. "@ })
  2073.             return ret;
  2074.         }
  2075.  
  2076.         public override int PromptForChoice(string caption, string message, System.Collections.ObjectModel.Collection<ChoiceDescription> choices, int defaultChoice)
  2077.         {
  2078. $(if ($noConsole) {@"
  2079.             int iReturn = Choice_Box.Show(choices, defaultChoice, caption, message);
  2080.             if (iReturn == -1) { iReturn = defaultChoice; }
  2081.             return iReturn;
  2082. "@ } else {@"
  2083.             if (!string.IsNullOrEmpty(caption)) WriteLine(caption);
  2084.             WriteLine(message);
  2085.             do {
  2086.                 int idx = 0;
  2087.                 SortedList<string, int> res = new SortedList<string, int>();
  2088.                 string defkey = "";
  2089.                 foreach (ChoiceDescription cd in choices)
  2090.                 {
  2091.                     string lkey = cd.Label.Substring(0, 1), ltext = cd.Label;
  2092.                     int pos = cd.Label.IndexOf('&');
  2093.                     if (pos > -1)
  2094.                     {
  2095.                         lkey = cd.Label.Substring(pos + 1, 1).ToUpper();
  2096.                         if (pos > 0)
  2097.                             ltext = cd.Label.Substring(0, pos) + cd.Label.Substring(pos + 1);
  2098.                         else
  2099.                             ltext = cd.Label.Substring(1);
  2100.                     }
  2101.                     res.Add(lkey.ToLower(), idx);
  2102.  
  2103.                     if (idx > 0) Write("  ");
  2104.                     if (idx == defaultChoice)
  2105.                     {
  2106.                         Write(VerboseForegroundColor, rawUI.BackgroundColor, string.Format("[{0}] {1}", lkey, ltext));
  2107.                         defkey = lkey;
  2108.                     }
  2109.                     else
  2110.                         Write(rawUI.ForegroundColor, rawUI.BackgroundColor, string.Format("[{0}] {1}", lkey, ltext));
  2111.                     idx++;
  2112.                 }
  2113.                 Write(rawUI.ForegroundColor, rawUI.BackgroundColor, string.Format("  [?] Help (default is \"{0}\"): ", defkey));
  2114.  
  2115.                 string inpkey = "";
  2116.                 try
  2117.                 {
  2118.                     inpkey = Console.ReadLine().ToLower();
  2119.                     if (res.ContainsKey(inpkey)) return res[inpkey];
  2120.                     if (string.IsNullOrEmpty(inpkey)) return defaultChoice;
  2121.                 }
  2122.                 catch { }
  2123.                 if (inpkey == "?")
  2124.                 {
  2125.                     foreach (ChoiceDescription cd in choices)
  2126.                     {
  2127.                         string lkey = cd.Label.Substring(0, 1);
  2128.                         int pos = cd.Label.IndexOf('&');
  2129.                         if (pos > -1) lkey = cd.Label.Substring(pos + 1, 1).ToUpper();
  2130.                         if (!string.IsNullOrEmpty(cd.HelpMessage))
  2131.                             WriteLine(rawUI.ForegroundColor, rawUI.BackgroundColor, string.Format("{0} - {1}", lkey, cd.HelpMessage));
  2132.                         else
  2133.                             WriteLine(rawUI.ForegroundColor, rawUI.BackgroundColor, string.Format("{0} -", lkey));
  2134.                     }
  2135.                 }
  2136.             } while (true);
  2137. "@ })
  2138.         }
  2139.  
  2140.         public override PSCredential PromptForCredential(string caption, string message, string userName, string targetName, PSCredentialTypes allowedCredentialTypes, PSCredentialUIOptions options)
  2141.         {
  2142. $(if (!$noConsole -and !$credentialGUI) {@"
  2143.             if (!string.IsNullOrEmpty(caption)) WriteLine(caption);
  2144.             WriteLine(message);
  2145.  
  2146.             string un;
  2147.             if ((string.IsNullOrEmpty(userName)) || ((options & PSCredentialUIOptions.ReadOnlyUserName) == 0))
  2148.             {
  2149.                 Write("User name: ");
  2150.                 un = ReadLine();
  2151.             }
  2152.             else
  2153.             {
  2154.                 Write("User name: ");
  2155.                 if (!string.IsNullOrEmpty(targetName)) Write(targetName + "\\");
  2156.                 WriteLine(userName);
  2157.                 un = userName;
  2158.             }
  2159.             SecureString pwd = null;
  2160.             Write("Password: ");
  2161.             pwd = ReadLineAsSecureString();
  2162.  
  2163.             if (string.IsNullOrEmpty(un)) un = "<NOUSER>";
  2164.             if (!string.IsNullOrEmpty(targetName))
  2165.             {
  2166.                 if (un.IndexOf('\\') < 0)
  2167.                     un = targetName + "\\" + un;
  2168.             }
  2169.  
  2170.             PSCredential c2 = new PSCredential(un, pwd);
  2171.             return c2;
  2172. "@ } else {@"
  2173.             Credential_Form.User_Pwd cred = Credential_Form.PromptForPassword(caption, message, targetName, userName, allowedCredentialTypes, options);
  2174.             if (cred != null)
  2175.             {
  2176.                 System.Security.SecureString x = new System.Security.SecureString();
  2177.                 foreach (char c in cred.Password.ToCharArray())
  2178.                     x.AppendChar(c);
  2179.  
  2180.                 return new PSCredential(cred.User, x);
  2181.             }
  2182.             return null;
  2183. "@ })
  2184.         }
  2185.  
  2186.         public override PSCredential PromptForCredential(string caption, string message, string userName, string targetName)
  2187.         {
  2188. $(if (!$noConsole -and !$credentialGUI) {@"
  2189.             if (!string.IsNullOrEmpty(caption)) WriteLine(caption);
  2190.             WriteLine(message);
  2191.  
  2192.             string un;
  2193.             if (string.IsNullOrEmpty(userName))
  2194.             {
  2195.                 Write("User name: ");
  2196.                 un = ReadLine();
  2197.             }
  2198.             else
  2199.             {
  2200.                 Write("User name: ");
  2201.                 if (!string.IsNullOrEmpty(targetName)) Write(targetName + "\\");
  2202.                 WriteLine(userName);
  2203.                 un = userName;
  2204.             }
  2205.             SecureString pwd = null;
  2206.             Write("Password: ");
  2207.             pwd = ReadLineAsSecureString();
  2208.  
  2209.             if (string.IsNullOrEmpty(un)) un = "<NOUSER>";
  2210.             if (!string.IsNullOrEmpty(targetName))
  2211.             {
  2212.                 if (un.IndexOf('\\') < 0)
  2213.                     un = targetName + "\\" + un;
  2214.             }
  2215.  
  2216.             PSCredential c2 = new PSCredential(un, pwd);
  2217.             return c2;
  2218. "@ } else {@"
  2219.             Credential_Form.User_Pwd cred = Credential_Form.PromptForPassword(caption, message, targetName, userName, PSCredentialTypes.Default, PSCredentialUIOptions.Default);
  2220.             if (cred != null)
  2221.             {
  2222.                 System.Security.SecureString x = new System.Security.SecureString();
  2223.                 foreach (char c in cred.Password.ToCharArray())
  2224.                     x.AppendChar(c);
  2225.  
  2226.                 return new PSCredential(cred.User, x);
  2227.             }
  2228.             return null;
  2229. "@ })
  2230.         }
  2231.  
  2232.         public override PSHostRawUserInterface RawUI
  2233.         {
  2234.             get
  2235.             {
  2236.                 return rawUI;
  2237.             }
  2238.         }
  2239.  
  2240. $(if ($noConsole) {@"
  2241.         private string ib_caption;
  2242.         private string ib_message;
  2243. "@ })
  2244.  
  2245.         public override string ReadLine()
  2246.         {
  2247. $(if (!$noConsole) {@"
  2248.             return Console.ReadLine();
  2249. "@ } else {@"
  2250.             string sWert = "";
  2251.             if (Input_Box.Show(ib_caption, ib_message, ref sWert) == DialogResult.OK)
  2252.                 return sWert;
  2253.             else
  2254. "@ })
  2255. $(if ($noConsole) { if ($exitOnCancel) {@"
  2256.                 Environment.Exit(1);
  2257.             return "";
  2258. "@ } else {@"
  2259.                 return "";
  2260. "@ } })
  2261.         }
  2262.  
  2263.         private System.Security.SecureString getPassword()
  2264.         {
  2265.             System.Security.SecureString pwd = new System.Security.SecureString();
  2266.             while (true)
  2267.             {
  2268.                 ConsoleKeyInfo i = Console.ReadKey(true);
  2269.                 if (i.Key == ConsoleKey.Enter)
  2270.                 {
  2271.                     Console.WriteLine();
  2272.                     break;
  2273.                 }
  2274.                 else if (i.Key == ConsoleKey.Backspace)
  2275.                 {
  2276.                     if (pwd.Length > 0)
  2277.                     {
  2278.                         pwd.RemoveAt(pwd.Length - 1);
  2279.                         Console.Write("\b \b");
  2280.                     }
  2281.                 }
  2282.                 else if (i.KeyChar != '\u0000')
  2283.                 {
  2284.                     pwd.AppendChar(i.KeyChar);
  2285.                     Console.Write("*");
  2286.                 }
  2287.             }
  2288.             return pwd;
  2289.         }
  2290.  
  2291.         public override System.Security.SecureString ReadLineAsSecureString()
  2292.         {
  2293.             System.Security.SecureString secstr = new System.Security.SecureString();
  2294. $(if (!$noConsole) {@"
  2295.             secstr = getPassword();
  2296. "@ } else {@"
  2297.             string sWert = "";
  2298.  
  2299.             if (Input_Box.Show(ib_caption, ib_message, ref sWert, true) == DialogResult.OK)
  2300.             {
  2301.                 foreach (char ch in sWert)
  2302.                     secstr.AppendChar(ch);
  2303.             }
  2304. "@ })
  2305. $(if ($noConsole) { if ($exitOnCancel) {@"
  2306.             else
  2307.                 Environment.Exit(1);
  2308. "@ } })
  2309.             return secstr;
  2310.         }
  2311.  
  2312.         // called by Write-Host
  2313.         public override void Write(ConsoleColor foregroundColor, ConsoleColor backgroundColor, string value)
  2314.         {
  2315. $(if (!$noOutput) { if (!$noConsole) {@"
  2316.             ConsoleColor fgc = Console.ForegroundColor, bgc = Console.BackgroundColor;
  2317.             Console.ForegroundColor = foregroundColor;
  2318.             Console.BackgroundColor = backgroundColor;
  2319.             Console.Write(value);
  2320.             Console.ForegroundColor = fgc;
  2321.             Console.BackgroundColor = bgc;
  2322. "@ } else {@"
  2323.             if ((!string.IsNullOrEmpty(value)) && (value != "\n"))
  2324.                 MessageBox.Show(value, System.AppDomain.CurrentDomain.FriendlyName);
  2325. "@ } })
  2326.         }
  2327.  
  2328.         public override void Write(string value)
  2329.         {
  2330. $(if (!$noOutput) { if (!$noConsole) {@"
  2331.             Console.Write(value);
  2332. "@ } else {@"
  2333.             if ((!string.IsNullOrEmpty(value)) && (value != "\n"))
  2334.                 MessageBox.Show(value, System.AppDomain.CurrentDomain.FriendlyName);
  2335. "@ } })
  2336.         }
  2337.  
  2338.         // called by Write-Debug
  2339.         public override void WriteDebugLine(string message)
  2340.         {
  2341. $(if (!$noError) { if (!$noConsole) {@"
  2342.             WriteLineInternal(DebugForegroundColor, DebugBackgroundColor, string.Format("DEBUG: {0}", message));
  2343. "@ } else {@"
  2344.             MessageBox.Show(message, System.AppDomain.CurrentDomain.FriendlyName, MessageBoxButtons.OK, MessageBoxIcon.Information);
  2345. "@ } })
  2346.         }
  2347.  
  2348.         // called by Write-Error
  2349.         public override void WriteErrorLine(string value)
  2350.         {
  2351. $(if (!$noError) { if (!$noConsole) {@"
  2352.             if (Console_Info.IsErrorRedirected())
  2353.                 Console.Error.WriteLine(string.Format("ERROR: {0}", value));
  2354.             else
  2355.                 WriteLineInternal(ErrorForegroundColor, ErrorBackgroundColor, string.Format("ERROR: {0}", value));
  2356. "@ } else {@"
  2357.             MessageBox.Show(value, System.AppDomain.CurrentDomain.FriendlyName, MessageBoxButtons.OK, MessageBoxIcon.Error);
  2358. "@ } })
  2359.         }
  2360.  
  2361.         public override void WriteLine()
  2362.         {
  2363. $(if (!$noOutput) { if (!$noConsole) {@"
  2364.             Console.WriteLine();
  2365. "@ } else {@"
  2366.             MessageBox.Show("", System.AppDomain.CurrentDomain.FriendlyName);
  2367. "@ } })
  2368.         }
  2369.  
  2370.         public override void WriteLine(ConsoleColor foregroundColor, ConsoleColor backgroundColor, string value)
  2371.         {
  2372. $(if (!$noOutput) { if (!$noConsole) {@"
  2373.             ConsoleColor fgc = Console.ForegroundColor, bgc = Console.BackgroundColor;
  2374.             Console.ForegroundColor = foregroundColor;
  2375.             Console.BackgroundColor = backgroundColor;
  2376.             Console.WriteLine(value);
  2377.             Console.ForegroundColor = fgc;
  2378.             Console.BackgroundColor = bgc;
  2379. "@ } else {@"
  2380.             if ((!string.IsNullOrEmpty(value)) && (value != "\n"))
  2381.                 MessageBox.Show(value, System.AppDomain.CurrentDomain.FriendlyName);
  2382. "@ } })
  2383.         }
  2384.  
  2385. $(if (!$noError -And !$noConsole) {@"
  2386.         private void WriteLineInternal(ConsoleColor foregroundColor, ConsoleColor backgroundColor, string value)
  2387.         {
  2388.             ConsoleColor fgc = Console.ForegroundColor, bgc = Console.BackgroundColor;
  2389.             Console.ForegroundColor = foregroundColor;
  2390.             Console.BackgroundColor = backgroundColor;
  2391.             Console.WriteLine(value);
  2392.             Console.ForegroundColor = fgc;
  2393.             Console.BackgroundColor = bgc;
  2394.         }
  2395. "@ })
  2396.  
  2397.         // called by Write-Output
  2398.         public override void WriteLine(string value)
  2399.         {
  2400. $(if (!$noOutput) { if (!$noConsole) {@"
  2401.             Console.WriteLine(value);
  2402. "@ } else {@"
  2403.             if ((!string.IsNullOrEmpty(value)) && (value != "\n"))
  2404.                 MessageBox.Show(value, System.AppDomain.CurrentDomain.FriendlyName);
  2405. "@ } })
  2406.         }
  2407.  
  2408. $(if ($noConsole) {@"
  2409.         public Progress_Form pf = null;
  2410. "@ })
  2411.         public override void WriteProgress(long sourceId, ProgressRecord record)
  2412.         {
  2413. $(if ($noConsole) {@"
  2414.             if (pf == null)
  2415.             {
  2416.                 if (record.RecordType == ProgressRecordType.Completed) return;
  2417.                 pf = new Progress_Form(ProgressForegroundColor);
  2418.                 pf.Show();
  2419.             }
  2420.             pf.Update(record);
  2421.             if (record.RecordType == ProgressRecordType.Completed)
  2422.             {
  2423.                 if (pf.GetCount() == 0) pf = null;
  2424.             }
  2425. "@ })
  2426.         }
  2427.  
  2428.         // called by Write-Verbose
  2429.         public override void WriteVerboseLine(string message)
  2430.         {
  2431. $(if (!$noOutput) { if (!$noConsole) {@"
  2432.             WriteLine(VerboseForegroundColor, VerboseBackgroundColor, string.Format("VERBOSE: {0}", message));
  2433. "@ } else {@"
  2434.             MessageBox.Show(message, System.AppDomain.CurrentDomain.FriendlyName, MessageBoxButtons.OK, MessageBoxIcon.Information);
  2435. "@ } })
  2436.         }
  2437.  
  2438.         // called by Write-Warning
  2439.         public override void WriteWarningLine(string message)
  2440.         {
  2441. $(if (!$noError) { if (!$noConsole) {@"
  2442.             WriteLineInternal(WarningForegroundColor, WarningBackgroundColor, string.Format("WARNING: {0}", message));
  2443. "@ } else {@"
  2444.             MessageBox.Show(message, System.AppDomain.CurrentDomain.FriendlyName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
  2445. "@ } })
  2446.         }
  2447.     }
  2448.  
  2449.     internal class MainModule : PSHost
  2450.     {
  2451.         private MainAppInterface parent;
  2452.         private MainModuleUI ui = null;
  2453.  
  2454.         private CultureInfo originalCultureInfo = System.Threading.Thread.CurrentThread.CurrentCulture;
  2455.  
  2456.         private CultureInfo originalUICultureInfo = System.Threading.Thread.CurrentThread.CurrentUICulture;
  2457.  
  2458.         private Guid myId = Guid.NewGuid();
  2459.  
  2460.         public MainModule(MainAppInterface app, MainModuleUI ui)
  2461.         {
  2462.             this.parent = app;
  2463.             this.ui = ui;
  2464.         }
  2465.  
  2466.         public class ConsoleColorProxy
  2467.         {
  2468.             private MainModuleUI _ui;
  2469.  
  2470.             public ConsoleColorProxy(MainModuleUI ui)
  2471.             {
  2472.                 if (ui == null) throw new ArgumentNullException("ui");
  2473.                 _ui = ui;
  2474.             }
  2475.  
  2476.             public ConsoleColor ErrorForegroundColor
  2477.             {
  2478.                 get
  2479.                 { return _ui.ErrorForegroundColor; }
  2480.                 set
  2481.                 { _ui.ErrorForegroundColor = value; }
  2482.             }
  2483.  
  2484.             public ConsoleColor ErrorBackgroundColor
  2485.             {
  2486.                 get
  2487.                 { return _ui.ErrorBackgroundColor; }
  2488.                 set
  2489.                 { _ui.ErrorBackgroundColor = value; }
  2490.             }
  2491.  
  2492.             public ConsoleColor WarningForegroundColor
  2493.             {
  2494.                 get
  2495.                 { return _ui.WarningForegroundColor; }
  2496.                 set
  2497.                 { _ui.WarningForegroundColor = value; }
  2498.             }
  2499.  
  2500.             public ConsoleColor WarningBackgroundColor
  2501.             {
  2502.                 get
  2503.                 { return _ui.WarningBackgroundColor; }
  2504.                 set
  2505.                 { _ui.WarningBackgroundColor = value; }
  2506.             }
  2507.  
  2508.             public ConsoleColor DebugForegroundColor
  2509.             {
  2510.                 get
  2511.                 { return _ui.DebugForegroundColor; }
  2512.                 set
  2513.                 { _ui.DebugForegroundColor = value; }
  2514.             }
  2515.  
  2516.             public ConsoleColor DebugBackgroundColor
  2517.             {
  2518.                 get
  2519.                 { return _ui.DebugBackgroundColor; }
  2520.                 set
  2521.                 { _ui.DebugBackgroundColor = value; }
  2522.             }
  2523.  
  2524.             public ConsoleColor VerboseForegroundColor
  2525.             {
  2526.                 get
  2527.                 { return _ui.VerboseForegroundColor; }
  2528.                 set
  2529.                 { _ui.VerboseForegroundColor = value; }
  2530.             }
  2531.  
  2532.             public ConsoleColor VerboseBackgroundColor
  2533.             {
  2534.                 get
  2535.                 { return _ui.VerboseBackgroundColor; }
  2536.                 set
  2537.                 { _ui.VerboseBackgroundColor = value; }
  2538.             }
  2539.  
  2540.             public ConsoleColor ProgressForegroundColor
  2541.             {
  2542.                 get
  2543.                 { return _ui.ProgressForegroundColor; }
  2544.                 set
  2545.                 { _ui.ProgressForegroundColor = value; }
  2546.             }
  2547.  
  2548.             public ConsoleColor ProgressBackgroundColor
  2549.             {
  2550.                 get
  2551.                 { return _ui.ProgressBackgroundColor; }
  2552.                 set
  2553.                 { _ui.ProgressBackgroundColor = value; }
  2554.             }
  2555.         }
  2556.  
  2557.         public override PSObject PrivateData
  2558.         {
  2559.             get
  2560.             {
  2561.                 if (ui == null) return null;
  2562.                 return _consoleColorProxy ?? (_consoleColorProxy = PSObject.AsPSObject(new ConsoleColorProxy(ui)));
  2563.             }
  2564.         }
  2565.  
  2566.         private PSObject _consoleColorProxy;
  2567.  
  2568.         public override System.Globalization.CultureInfo CurrentCulture
  2569.         {
  2570.             get
  2571.             {
  2572.                 return this.originalCultureInfo;
  2573.             }
  2574.         }
  2575.  
  2576.         public override System.Globalization.CultureInfo CurrentUICulture
  2577.         {
  2578.             get
  2579.             {
  2580.                 return this.originalUICultureInfo;
  2581.             }
  2582.         }
  2583.  
  2584.         public override Guid InstanceId
  2585.         {
  2586.             get
  2587.             {
  2588.                 return this.myId;
  2589.             }
  2590.         }
  2591.  
  2592.         public override string Name
  2593.         {
  2594.             get
  2595.             {
  2596.                 return "PSRunspace-Host";
  2597.             }
  2598.         }
  2599.  
  2600.         public override PSHostUserInterface UI
  2601.         {
  2602.             get
  2603.             {
  2604.                 return ui;
  2605.             }
  2606.         }
  2607.  
  2608.         public override Version Version
  2609.         {
  2610.             get
  2611.             {
  2612.                 return new Version(0, 5, 0, 27);
  2613.             }
  2614.         }
  2615.  
  2616.         public override void EnterNestedPrompt()
  2617.         {
  2618.         }
  2619.  
  2620.         public override void ExitNestedPrompt()
  2621.         {
  2622.         }
  2623.  
  2624.         public override void NotifyBeginApplication()
  2625.         {
  2626.             return;
  2627.         }
  2628.  
  2629.         public override void NotifyEndApplication()
  2630.         {
  2631.             return;
  2632.         }
  2633.  
  2634.         public override void SetShouldExit(int exitCode)
  2635.         {
  2636.             this.parent.ShouldExit = true;
  2637.             this.parent.ExitCode = exitCode;
  2638.         }
  2639.     }
  2640.  
  2641.     internal interface MainAppInterface
  2642.     {
  2643.         bool ShouldExit { get; set; }
  2644.         int ExitCode { get; set; }
  2645.     }
  2646.  
  2647.     internal class MainApp : MainAppInterface
  2648.     {
  2649.         private bool shouldExit;
  2650.  
  2651.         private int exitCode;
  2652.  
  2653.         public bool ShouldExit
  2654.         {
  2655.             get { return this.shouldExit; }
  2656.             set { this.shouldExit = value; }
  2657.         }
  2658.  
  2659.         public int ExitCode
  2660.         {
  2661.             get { return this.exitCode; }
  2662.             set { this.exitCode = value; }
  2663.         }
  2664.  
  2665.         $(if ($STA){"[STAThread]"})$(if ($MTA){"[MTAThread]"})
  2666.         private static int Main(string[] args)
  2667.         {
  2668. $(if (!$noConsole -and $UNICODEEncoding) {@"
  2669.             System.Console.OutputEncoding = new System.Text.UnicodeEncoding();
  2670. "@ })
  2671.             $culture
  2672.  
  2673.             $(if (!$noVisualStyles -and $noConsole) { "Application.EnableVisualStyles();" })
  2674.             MainApp me = new MainApp();
  2675.  
  2676.             bool paramWait = false;
  2677.             string extractFN = string.Empty;
  2678.  
  2679.             MainModuleUI ui = new MainModuleUI();
  2680.             MainModule host = new MainModule(me, ui);
  2681.             System.Threading.ManualResetEvent mre = new System.Threading.ManualResetEvent(false);
  2682.  
  2683.             AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
  2684.  
  2685.             try
  2686.             {
  2687.                 using (Runspace myRunSpace = RunspaceFactory.CreateRunspace(host))
  2688.                 {
  2689.                     $(if ($STA -or $MTA) {"myRunSpace.ApartmentState = System.Threading.ApartmentState."})$(if ($STA){"STA"})$(if ($MTA){"MTA"});
  2690.                     myRunSpace.Open();
  2691.  
  2692.                     using (PowerShell pwsh = PowerShell.Create())
  2693.                     {
  2694. $(if (!$noConsole) {@"
  2695.                         Console.CancelKeyPress += new ConsoleCancelEventHandler(delegate(object sender, ConsoleCancelEventArgs e)
  2696.                         {
  2697.                             try
  2698.                             {
  2699.                                 pwsh.BeginStop(new AsyncCallback(delegate(IAsyncResult r)
  2700.                                 {
  2701.                                     mre.Set();
  2702.                                     e.Cancel = true;
  2703.                                 }), null);
  2704.                             }
  2705.                             catch
  2706.                             {
  2707.                             };
  2708.                         });
  2709. "@ })
  2710.  
  2711.                         pwsh.Runspace = myRunSpace;
  2712.                         pwsh.Streams.Error.DataAdded += new EventHandler<DataAddedEventArgs>(delegate(object sender, DataAddedEventArgs e)
  2713.                         {
  2714.                             ui.WriteErrorLine(((PSDataCollection<ErrorRecord>)sender)[e.Index].ToString());
  2715.                         });
  2716.  
  2717.                         PSDataCollection<string> colInput = new PSDataCollection<string>();
  2718. $(if (!$runtime20) {@"
  2719.                         if (Console_Info.IsInputRedirected())
  2720.                         { // read standard input
  2721.                             string sItem = "";
  2722.                             while ((sItem = Console.ReadLine()) != null)
  2723.                             { // add to powershell pipeline
  2724.                                 colInput.Add(sItem);
  2725.                             }
  2726.                         }
  2727. "@ })
  2728.                         colInput.Complete();
  2729.  
  2730.                         PSDataCollection<PSObject> colOutput = new PSDataCollection<PSObject>();
  2731.                         colOutput.DataAdded += new EventHandler<DataAddedEventArgs>(delegate(object sender, DataAddedEventArgs e)
  2732.                         {
  2733.                             ui.WriteLine(colOutput[e.Index].ToString());
  2734.                         });
  2735.  
  2736.                         int separator = 0;
  2737.                         int idx = 0;
  2738.                         foreach (string s in args)
  2739.                         {
  2740.                             if (string.Compare(s, "-whatt".Replace("hat", "ai"), true) == 0)
  2741.                                 paramWait = true;
  2742.                             else if (s.StartsWith("-extdummt".Replace("dumm", "rac"), StringComparison.InvariantCultureIgnoreCase))
  2743.                             {
  2744.                                 string[] s1 = s.Split(new string[] { ":" }, 2, StringSplitOptions.RemoveEmptyEntries);
  2745.                                 if (s1.Length != 2)
  2746.                                 {
  2747. $(if (!$noConsole) {@"
  2748.                                     Console.WriteLine("If you spzzcify thzz -zzxtract option you nzzed to add a filzz for zzxtraction in this way\r\n   -zzxtract:\"<filzznamzz>\"".Replace("zz", "e"));
  2749. "@ } else {@"
  2750.                                     MessageBox.Show("If you spzzcify thzz -zzxtract option you nzzed to add a filzz for zzxtraction in this way\r\n   -zzxtract:\"<filzznamzz>\"".Replace("zz", "e"), System.AppDomain.CurrentDomain.FriendlyName, MessageBoxButtons.OK, MessageBoxIcon.Error);
  2751. "@ })
  2752.                                     return 1;
  2753.                                 }
  2754.                                 extractFN = s1[1].Trim(new char[] { '\"' });
  2755.                             }
  2756.                             else if (string.Compare(s, "-end", true) == 0)
  2757.                             {
  2758.                                 separator = idx + 1;
  2759.                                 break;
  2760.                             }
  2761.                             else if (string.Compare(s, "-debug", true) == 0)
  2762.                             {
  2763.                                 System.Diagnostics.Debugger.Launch();
  2764.                                 break;
  2765.                             }
  2766.                             idx++;
  2767.                         }
  2768.  
  2769.                         string script = System.Text.Encoding.UTF8.GetString(System.Convert.FromBase64String(@"$($script)"));
  2770.  
  2771.                         if (!string.IsNullOrEmpty(extractFN))
  2772.                         {
  2773.                             System.IO.File.WriteAllText(extractFN, script);
  2774.                             return 0;
  2775.                         }
  2776.  
  2777.                         pwsh.AddScript(script);
  2778.  
  2779.                         // parse parameters
  2780.                         string argbuffer = null;
  2781.                         // regex for named parameters
  2782.                         System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"^-([^: ]+)[ :]?([^:]*)$");
  2783.  
  2784.                         for (int i = separator; i < args.Length; i++)
  2785.                         {
  2786.                             System.Text.RegularExpressions.Match match = regex.Match(args[i]);
  2787.                             double dummy;
  2788.  
  2789.                             if ((match.Success && match.Groups.Count == 3) && (!Double.TryParse(args[i], out dummy)))
  2790.                             { // parameter in powershell style, means named parameter found
  2791.                                 if (argbuffer != null) // already a named parameter in buffer, then flush it
  2792.                                     pwsh.AddParameter(argbuffer);
  2793.  
  2794.                                 if (match.Groups[2].Value.Trim() == "")
  2795.                                 { // store named parameter in buffer
  2796.                                     argbuffer = match.Groups[1].Value;
  2797.                                 }
  2798.                                 else
  2799.                                     // caution: when called in powershell $TRUE gets converted, when called in cmd.exe not
  2800.                                     if ((match.Groups[2].Value == "$TRUE") || (match.Groups[2].Value.ToUpper() == "\x24TRUE"))
  2801.                                     { // switch found
  2802.                                         pwsh.AddParameter(match.Groups[1].Value, true);
  2803.                                         argbuffer = null;
  2804.                                     }
  2805.                                     else
  2806.                                         // caution: when called in powershell $FALSE gets converted, when called in cmd.exe not
  2807.                                         if ((match.Groups[2].Value == "$FALSE") || (match.Groups[2].Value.ToUpper() == "\x24"+"FALSE"))
  2808.                                         { // switch found
  2809.                                             pwsh.AddParameter(match.Groups[1].Value, false);
  2810.                                             argbuffer = null;
  2811.                                         }
  2812.                                         else
  2813.                                         { // named parameter with value found
  2814.                                             pwsh.AddParameter(match.Groups[1].Value, match.Groups[2].Value);
  2815.                                             argbuffer = null;
  2816.                                         }
  2817.                             }
  2818.                             else
  2819.                             { // unnamed parameter found
  2820.                                 if (argbuffer != null)
  2821.                                 { // already a named parameter in buffer, so this is the value
  2822.                                     pwsh.AddParameter(argbuffer, args[i]);
  2823.                                     argbuffer = null;
  2824.                                 }
  2825.                                 else
  2826.                                 { // position parameter found
  2827.                                     pwsh.AddArgument(args[i]);
  2828.                                 }
  2829.                             }
  2830.                         }
  2831.  
  2832.                         if (argbuffer != null) pwsh.AddParameter(argbuffer); // flush parameter buffer...
  2833.  
  2834.                         // convert output to strings
  2835.                         pwsh.AddCommand("out-string");
  2836.                         // with a single string per line
  2837.                         pwsh.AddParameter("stream");
  2838.  
  2839.                         pwsh.BeginInvoke<string, PSObject>(colInput, colOutput, null, new AsyncCallback(delegate(IAsyncResult ar)
  2840.                         {
  2841.                             if (ar.IsCompleted)
  2842.                                 mre.Set();
  2843.                         }), null);
  2844.  
  2845.                         while (!me.ShouldExit && !mre.WaitOne(100))
  2846.                         { };
  2847.  
  2848.                         pwsh.Stop();
  2849.  
  2850.                         if (pwsh.InvocationStateInfo.State == PSInvocationState.Failed)
  2851.                             ui.WriteErrorLine(pwsh.InvocationStateInfo.Reason.Message);
  2852.                     }
  2853.  
  2854.                     myRunSpace.Close();
  2855.                 }
  2856.             }
  2857.             catch (Exception ex)
  2858.             {
  2859. $(if (!$noError) { if (!$noConsole) {@"
  2860.                 Console.Write("An exception occured: ");
  2861.                 Console.WriteLine(ex.Message);
  2862. "@ } else {@"
  2863.                 MessageBox.Show("An exception occured: " + ex.Message, System.AppDomain.CurrentDomain.FriendlyName, MessageBoxButtons.OK, MessageBoxIcon.Error);
  2864. "@ } })
  2865.             }
  2866.  
  2867.             if (paramWait)
  2868.             {
  2869. $(if (!$noConsole) {@"
  2870.                 Console.WriteLine("Hit any key to exit...");
  2871.                 Console.ReadKey();
  2872. "@ } else {@"
  2873.                 MessageBox.Show("Click OK to exit...", System.AppDomain.CurrentDomain.FriendlyName);
  2874. "@ })
  2875.             }
  2876.             return me.ExitCode;
  2877.         }
  2878.  
  2879.         static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
  2880.         {
  2881.             throw new Exception("Unhandled exception in " + System.AppDomain.CurrentDomain.FriendlyName);
  2882.         }
  2883.     }
  2884. }
  2885. "@
  2886.  
  2887. $configFileForEXE2 = "<?xml version=""1.0"" encoding=""utf-8"" ?>`r`n<configuration><startup><supportedRuntime version=""v2.0.50727""/></startup></configuration>"
  2888. $configFileForEXE3 = "<?xml version=""1.0"" encoding=""utf-8"" ?>`r`n<configuration><startup><supportedRuntime version=""v4.0"" sku="".NETFramework,Version=v4.0"" /></startup></configuration>"
  2889.  
  2890. if ($longPaths)
  2891. {
  2892.     $configFileForEXE3 = "<?xml version=""1.0"" encoding=""utf-8"" ?>`r`n<configuration><startup><supportedRuntime version=""v4.0"" sku="".NETFramework,Version=v4.0"" /></startup><runtime><AppContextSwitchOverrides value=""Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false"" /></runtime></configuration>"
  2893. }
  2894.  
  2895. Write-Output "Compiling file...`n"
  2896. $cr = $cop.CompileAssemblyFromSource($cp, $programFrame)
  2897. if ($cr.Errors.Count -gt 0)
  2898. {
  2899.     if (Test-Path $outputFile)
  2900.     {
  2901.         Remove-Item $outputFile -Verbose:$FALSE
  2902.     }
  2903.     Write-Error -ErrorAction Continue "Could not create the PowerShell .exe file because of compilation errors. Use -verbose parameter to see details."
  2904.     $cr.Errors | ForEach-Object { Write-Verbose $_ }
  2905. }
  2906. else
  2907. {
  2908.     if (Test-Path $outputFile)
  2909.     {
  2910.         Write-Output "Output file $outputFile written"
  2911.  
  2912.         if ($prepareDebug)
  2913.         {
  2914.             $cr.TempFiles | Where-Object { $_ -ilike "*.cs" } | Select-Object -First 1 | ForEach-Object {
  2915.                 $dstSrc = ([System.IO.Path]::Combine([System.IO.Path]::GetDirectoryName($outputFile), [System.IO.Path]::GetFileNameWithoutExtension($outputFile)+".cs"))
  2916.                 Write-Output "Source file name for debug copied: $($dstSrc)"
  2917.                 Copy-Item -Path $_ -Destination $dstSrc -Force
  2918.             }
  2919.             $cr.TempFiles | Remove-Item -Verbose:$FALSE -Force -ErrorAction SilentlyContinue
  2920.         }
  2921.         if ($CFGFILE)
  2922.         {
  2923.             if ($runtime20)
  2924.             {
  2925.                 $configFileForEXE2 | Set-Content ($outputFile+".config") -Encoding UTF8
  2926.             }
  2927.             if ($runtime40)
  2928.             {
  2929.                 $configFileForEXE3 | Set-Content ($outputFile+".config") -Encoding UTF8
  2930.             }
  2931.             Write-Output "Config file for EXE created"
  2932.         }
  2933.     }
  2934.     else
  2935.     {
  2936.         Write-Error -ErrorAction "Continue" "Output file $outputFile not written"
  2937.     }
  2938. }
  2939.  
  2940. if ($requireAdmin -or $DPIAware -or $supportOS -or $longPaths)
  2941. { if (Test-Path $($outputFile+".win32manifest"))
  2942.     {
  2943.         Remove-Item $($outputFile+".win32manifest") -Verbose:$FALSE
  2944.     }
  2945. }
Add Comment
Please, Sign In to add comment