Benutzer mit den meisten Antworten
PowerShell: PS2EXE-GUI.ps1 und PS2EXE.ps1 ?

Frage
-
Hallo liebe Community!
Ich habe das PowerShell Skript PS2EXE.ps1 etwas verbessert und dazu eine GUI geschrieben.
Könnte jemand hier im Forum einen Blick darauf werfen, z.B. wegen Fehler im Skript ö.Ä?
Was hat es mit dem -lcid (Location ID for the compiled EXE. Current user culture if not specified) im PS2EXE.ps1 Skript auf sich? Wird dazu eine Zahl oder eine andere Eingabe gemacht oder nur -lcid eingegeben?
z.B.:
ps2exe.ps1 -inputFile ...\PS2EXE\sample.ps1 -outputFile ...\PS2EXE\sample.exe -sta -noConsole -runtime40 -verbose -x64 -lcid
oder:
ps2exe.ps1 -inputFile ...\PS2EXE\sample.ps1 -outputFile ...\PS2EXE\sample.exe -sta -noConsole -runtime40 -verbose -x64 -lcid FFFFF (oder -lcid "User")
oder ...???
Wenn alles in Ordnung ist, wollte ich die beiden Skripte hier hochladen/anbieten... wenn das geht oder erwünscht ist.
[geändertes PS2EXE.ps1 Skript:]
param([string]$inputFile=$null, [string]$outputFile=$null, [switch]$verbose, [switch] $debug, [switch]$runtime20, [switch]$x86, [switch]$x64, [switch]$runtime30, [switch]$runtime40, [int]$lcid, [switch]$sta, [switch]$mta, [switch]$noConsole, [switch]$nested, [string]$iconFile=$null) <##########################################################################################> <## ##> <## PS2EXE v0.5.0.0 - http://ps2exe.codeplex.com ##> <## written by: ##> <## * Ingo Karstein (http://blog.karstein-consulting.com) ##> <## ##> <## This script is released under Microsoft Public Licence ##> <## that can be downloaded here: ##> <## http://www.microsoft.com/opensource/licenses.mspx#Ms-PL ##> <## ##> <## This script was created using PowerGUI (http://www.powergui.org) ##> <## ... and Windows PowerShell ISE v4.0 ##> <## 17.02.2017 From line 75 up to line 83 added by Alexander101177/Mandragora ##> <## ##> <##########################################################################################> if( !$nested ) { Write-Host "PS2EXE; v0.5.0.0 by Ingo Karstein (http://blog.karstein-consulting.com)" Write-Host "" } else { write-host "PowerShell 2.0 environment started..." Write-Host "" } if( $runtime20 -eq $true -and $runtime30 -eq $true ) { write-host "YOU CANNOT USE SWITCHES -runtime20 AND -runtime30 AT THE SAME TIME!" exit -1 } if( $sta -eq $true -and $mta -eq $true ) { write-host "YOU CANNOT USE SWITCHES -sta AND -eta AT THE SAME TIME!" exit -1 } if( [string]::IsNullOrEmpty($inputFile) -or [string]::IsNullOrEmpty($outputFile) ) { Write-Host "Usage:" Write-Host "" Write-Host " powershell.exe -command ""&'.\ps2exe.ps1' [-inputFile] '<file_name>'" write-host " [-outputFile] '<file_name>' " write-host " [-verbose] [-debug] [-runtime20] [-runtime30]""" Write-Host "" Write-Host " inputFile = PowerShell script that you want to convert to EXE" Write-Host " outputFile = destination EXE file name" Write-Host " verbose = Output verbose informations - if any" Write-Host " debug = generate debug informations for output file" Write-Host "" Write-Host " runtime20 = this switch forces PS2EXE to create a config file for" write-host " the generated EXE that contains the ""supported .NET" write-host " Framework versions"" setting for .NET Framework 2.0" write-host " for PowerShell 2.0" Write-Host " runtime30 = this switch forces PS2EXE to create a config file for" write-host " the generated EXE that contains the ""supported .NET" write-host " Framework versions"" setting for .NET Framework 4.0" write-host " for PowerShell 3.0" Write-Host " runtime40 = this switch forces PS2EXE to create a config file for" write-host " the generated EXE that contains the ""supported .NET" write-host " Framework versions"" setting for .NET Framework 4.0" write-host " for PowerShell 4.0" Write-Host " lcid = Location ID for the compiled EXE. Current user" write-host " culture if not specified." Write-Host " x86 = Compile for 32-bit runtime only" Write-Host " x64 = Compile for 64-bit runtime only" Write-Host " sta = Single Thread Apartment Mode" Write-Host " mta = Multi Thread Apartment Mode" write-host " noConsole = The resulting EXE file starts without a console window just like a Windows Forms app." write-host "" } $psversion = 0 #Added line 74 to 83 Alexander101177/Mandragora if($PSVersionTable.PSVersion.Major -eq 6) { $psversion = 6 write-host "You are using PowerShell 6.0." } if($PSVersionTable.PSVersion.Major -eq 5) { $psversion = 5 write-host "You are using PowerShell 5.0." } if($PSVersionTable.PSVersion.Major -eq 4) { $psversion = 4 write-host "You are using PowerShell 4.0." }
17.02.2017 Von Zeile 75 bis Zeile 83 erweitert auf PowerShell 5.0 und 6.0 (?).
17.02.2017 In Zeile 50 den doppelt vorkommenden Write-Host "debug=generate debug informations for output file" Eintrag in
Write-Host "" geändert.
[Skript für PS2EXE.ps1 GUI]:
<##########################################################################################> <## ##> <## PS2EXE.ps1 GUI ##> <## Pre-Version: 2017.02.22 ##> <## written by: ##> <## * Alexander101177@yahoo.de/Mandragora ##> <## This script was created using PowerShell_ise v 5.1.14393.693 ##> <## at the 17.02.2017 ##> <## ##> <##########################################################################################> $global:PS2EXEvers = "Version: 2017.02.22" Clear-Host [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") [void][reflection.assembly]::Load("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") [void][reflection.assembly]::Load("System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") [void][reflection.assembly]::Load("System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") [void][reflection.assembly]::Load("System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") [void][reflection.assembly]::Load("System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a") [void][reflection.assembly]::Load("System.Xml, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") [void][reflection.assembly]::Load("System.DirectoryServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a") [void][reflection.assembly]::Load("System.Core, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089") [void][reflection.assembly]::Load("System.ServiceProcess, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a") # GroupBox 1 - 6 # GroupBox 1 $radioButton1 = New-Object System.Windows.Forms.RadioButton $radioButton2 = New-Object System.Windows.Forms.RadioButton $groupBox1 = New-Object System.Windows.Forms.GroupBox $groupBox1.Controls.AddRange( @( $radioButton1, $radioButton2 )) $groupBox1.Location = New-Object System.Drawing.Point(10, 120) $groupBox1.Name = 'groupBox1' $groupBox1.Size = New-Object System.Drawing.Size(115,65) $groupBox1.Text = 'Set Verbose' # GroupBox 2 $radioButton3 = New-Object System.Windows.Forms.RadioButton $radioButton4 = New-Object System.Windows.Forms.RadioButton $groupBox2 = New-Object System.Windows.Forms.GroupBox $groupBox2.Controls.AddRange( @( $radioButton3, $radioButton4 )) $groupBox2.Location = New-Object System.Drawing.Point(140, 120) $groupBox2.Name = 'groupBox2' $groupBox2.Size = New-Object System.Drawing.Size(115,65) $groupBox2.Text = 'Set Debug' # GroupBox 3 $radioButton5 = New-Object System.Windows.Forms.RadioButton $radioButton6 = New-Object System.Windows.Forms.RadioButton $groupBox3 = New-Object System.Windows.Forms.GroupBox $groupBox3.Controls.AddRange( @( $radioButton5, $radioButton6 )) $groupBox3.Location = New-Object System.Drawing.Point(270, 120) $groupBox3.Name = 'groupBox3' $groupBox3.Size = New-Object System.Drawing.Size(115,65) $groupBox3.Text = 'Set x32/x64 Bit' # GroupBox 4 $radioButton7 = New-Object System.Windows.Forms.RadioButton $radioButton8 = New-Object System.Windows.Forms.RadioButton $groupBox4 = New-Object System.Windows.Forms.GroupBox $groupBox4.Controls.AddRange( @( $radioButton7, $radioButton8 )) $groupBox4.Location = New-Object System.Drawing.Point(400, 120) $groupBox4.Name = 'groupBox4' $groupBox4.Size = New-Object System.Drawing.Size(115,65) $groupBox4.Text = 'Set Console' # GroupBox 5 $radioButton9 = New-Object System.Windows.Forms.RadioButton $radioButton10 = New-Object System.Windows.Forms.RadioButton $groupBox5 = New-Object System.Windows.Forms.GroupBox $groupBox5.Controls.AddRange( @( $radioButton9, $radioButton10 )) $groupBox5.Location = New-Object System.Drawing.Point(10,190) $groupBox5.Name = 'groupBox5' $groupBox5.Size = New-Object System.Drawing.Size(125,65) $groupBox5.Text = 'Single/Multi Thread Apartment' # GroupBox 6 $radioButton11 = New-Object System.Windows.Forms.RadioButton $radioButton12 = New-Object System.Windows.Forms.RadioButton $radioButton13 = New-Object System.Windows.Forms.RadioButton $groupBox6 = New-Object System.Windows.Forms.GroupBox $groupBox6.Controls.AddRange( @( $radioButton11, $radioButton12, $radioButton13 )) $groupBox6.Location = New-Object System.Drawing.Point(140,190) $groupBox6.Name = 'groupBox6' $groupBox6.Size = New-Object System.Drawing.Size(220,65) $groupBox6.Text = 'NET Runtime' # Radio Buttons 1 - 13 # radioButton1 $radioButton1.Location = New-Object System.Drawing.Point(8, 15) $radioButton1.Name = 'radioButton1' $radioButton1.Checked = "True" $radioButton1.Text = 'Verbose off' # radioButton2 $radioButton2.Location = New-Object System.Drawing.Point(8, 35) $radioButton2.Name = 'radioButton2' $radioButton2.Text = 'Verbose on' # radioButton3 $radioButton3.Location = New-Object System.Drawing.Point(8, 15) $radioButton3.Name = 'radioButton3' $radioButton3.Checked = "True" $radioButton3.Text = 'Debug off' # radioButton4 $radioButton4.Location = New-Object System.Drawing.Point(8, 35) $radioButton4.Name = 'radioButton2' $radioButton4.Text = 'Debug on' # radioButton5 $radioButton5.Location = New-Object System.Drawing.Point(8, 15) $radioButton5.Name = 'radioButton5' $radioButton5.Checked = "True" $radioButton5.Text = 'x32' # radioButton6 $radioButton6.Location = New-Object System.Drawing.Point(8, 35) $radioButton6.Name = 'radioButton6' $radioButton6.Text = 'x64' # radioButton7 $radioButton7.Location = New-Object System.Drawing.Point(8, 15) $radioButton7.Name = 'radioButton7' $radioButton7.Checked = 'True' $radioButton7.Text = 'Console off' # radioButton8 $radioButton8.Location = New-Object System.Drawing.Point(8, 35) $radioButton8.Name = 'radioButton8' $radioButton8.Text = 'Console on' # radioButton9 $radioButton9.Location = New-Object System.Drawing.Point(8, 15) $radioButton9.Name = 'radioButton9' $radioButton9.Checked = 'True' $radioButton9.Text = 'Single Thread' # radioButton10 $radioButton10.Location = New-Object System.Drawing.Point(8, 35) $radioButton10.Name = 'radioButton10' $radioButton10.Text = 'Multi Thread' # radioButton11 $radioButton11.Location = New-Object System.Drawing.Point(8, 15) $radioButton11.Name = 'radioButton11' $radioButton11.Checked = 'True' $radioButton11.Text = 'V 4.0' # radioButton12 $radioButton12.Location = New-Object System.Drawing.Point(8, 35) $radioButton12.Name = 'radioButton12' $radioButton12.Text = 'V 3.0' # radioButton13 $radioButton13.Location = New-Object System.Drawing.Point(113, 35) $radioButton13.Name = 'radioButton13' $radioButton13.Text = 'V 2.0' #Functions for Buttons 1 - 4 # Function for Button1 Function SelectPS2EXE {$global:PS2EXEDialog = # Open a Windows standard "Open File Dialog". [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null # Create new Forms instance $global:PS2EXEscr = New-Object System.Windows.Forms.OpenFileDialog # Define starting / default directory $global:PS2EXEscr.InitialDirectory = $global:PS2EXEDialog # Set filter for file types $global:PS2EXEscr.Filter = "PS2EXE (*.ps1*)| *.ps1*" # Open dialog $global:PS2EXEscr.ShowDialog() | Out-Null # Return the file path return $global:PS2EXEscr.FileName } # Function for Button2 Function SelectInputFile {$global:FileInDialog = # Open a Windows standard "Open File Dialog". [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null # Create new Forms instance $global:FileIn = New-Object System.Windows.Forms.OpenFileDialog # Set filter for file types $global:FileIn.Filter = "PowerShell files (*.ps1*)| *.ps1*|All files (*.*)| *.*" # Open dialog $global:FileIn.ShowDialog() | Out-Null # Return the file path return $global:FileIn.FileName } # Function for Button3 Function SelectOutputFile {$global:FileOutDialog = # Open a Windows standard "Save File Dialog". [System.Reflection.Assembly]::LoadWithPartialName("System.windows.forms") | Out-Null # Create new Forms instance $global:FileOut = New-Object System.Windows.Forms.SaveFileDialog # Set filter for file types $FileOut.Filter = "PE file (*.exe*)| *.exe" # Open dialog $global:FileOut.ShowDialog() | Out-Null # Return the file path return $global:FileOut.FileName } # Function for Button4 function StartCompile {$StartCompDialog = Clear-Host $PS2EXE = $global:PS2EXEscr.FileName $FileInput = $global:FileIn.FileName $FileOutput = $global:FileOut.FileName foreach ($o1 in @($radioButton1,$radioButton2)){ if ($o1.Checked){ $option1 = $o1.Text} } foreach ($o2 in @($radioButton3,$radioButton4)){ if ($o2.Checked){ $option2 = $o2.Text} } foreach ($o3 in @($radioButton5,$radioButton6)){ if ($o3.Checked){ $option3 = $o3.Text} } foreach ($o4 in @($radioButton7,$radioButton8)){ if ($o4.Checked){ $option4 = $o4.Text} } foreach ($o5 in @($radioButton9,$radioButton10)){ if ($o5.Checked){ $option5 = $o5.Text} } foreach ($o6 in @($radioButton11,$radioButton12,$radiobutton13)){ if ($o6.Checked){ $option6 = $o6.Text} } if ( $option1 -eq "Verbose on" ) { $verbo = "-verbose" } else { $verbo = "" } if ( $option2 -eq "Debug on" ) { $Debg = "-debug" } else { $Debg = "" } if ( $option3 -eq "x32" ) { $x32_x64Bit = "-x32" } else { $x32_x64Bit = "-x64" } if ( $option4 -eq "Console off" ) { $noCons = "-noConsole" } else { $noCons = "" } if ( $option5 -eq "Single Thread" ) { $ThreadApartm = "-sta" } else { $ThreadApartm = "-mta" } if ( $option6 -eq "V 4.0" ) { $rtime = "-runtime40" } if ( $option6 -eq "V 3.0" ) { $rtime = "-runtime30" } if ( $option6 -eq "V 2.0" ) { $rtime = "-runtime20" } # Variable console output - not really necessary write-host "" write-host $PS2EXEvers write-host $option1 write-host $option2 write-host $option3 write-host $option4 write-host $option5 write-host $option6 write-host "PS2EXE string: " $PS2EXE write-host "FileIn string: " $FileInput write-host "FileOut: " $FileOutput write-host "Verbose? " $verbo write-host "Console? " $noCons write-host "ThreadApartment? " $ThreadApartm write-host "Debug? " $Debg write-host "Runtime? " $rtime write-host "x32 or x64 Bit? " $x32_x64Bit # PowerShell -command "& $PS2EXE -inputFile $FileInput -outputFile $FileOutput $ThreadApartm $verbo $Debg $noCons $rtime $x32_x64Bit" } # Window1 creation $Window1 = New-Object System.Windows.Forms.Form $Window1.Size = New-Object System.Drawing.Size(545,400) $Window1.MaximumSize = "595,450" $Window1.MinimumSize = "545,400" $Window1.Text = "PS2EXE GUI - Make PE.exe files of your PowerShell scripts!" $Window1.StartPosition = "CenterScreen" $Window1.BackColor = "#595fff" $Window1.Icon = $Icon $Window1.Font = $Font $Window1.WindowState = "Normal" # Textlabel 1 - 2 # Textlabel1 $Label1 = New-Object System.Windows.Forms.Label $Label1.Location = New-Object System.Drawing.Size(195,15) $Label1.Text = $global:PS2EXEvers $Label1.AutoSize = $True # Textlabel2 $Label2 = New-Object System.Windows.Forms.Label $Label2.Location = New-Object System.Drawing.Size(10,265) $Label2.Text = "Alexander101177@yahoo.de" $Label2.AutoSize = $True # Buttons 1 - 4 creation # Button1 creation $Button1 = New-Object System.Windows.Forms.Button $Button1.Location = New-Object System.Drawing.Size(50,40) $Button1.Size = New-Object System.Drawing.Size(100,70) $Button1.Text = "Load PS2EXE.ps1 PowerShell script" $Button1.TabIndex = 5 $Button1.BackColor = "white" $Button1.Add_Click({SelectPS2EXE}) $Window1.Controls.Add($Button1) # Button2 creation $Button2 = New-Object System.Windows.Forms.Button $Button2.Location = New-Object System.Drawing.Size(150,40) $Button2.Size = New-Object System.Drawing.Size(100,70) $Button2.Text = "Load PowerShell script to compile" $Button2.TabIndex = 5 $Button2.BackColor = "white" $Button2.Add_Click({SelectInputFile}) $Window1.Controls.Add($Button2) # Button3 creation $Button3 = New-Object System.Windows.Forms.Button $Button3.Location = New-Object System.Drawing.Size(250,40) $Button3.Size = New-Object System.Drawing.Size(100,70) $Button3.Text = "Save as... PE.exe" $Button3.TabIndex = 5 $Button3.BackColor = "white" $Button3.Add_Click({SelectOutputFile}) $Window1.Controls.Add($Button3) # Button4 creation $Button4 = New-Object System.Windows.Forms.Button $Button4.Location = New-Object System.Drawing.Size(350,40) $Button4.Size = New-Object System.Drawing.Size(100,70) $Button4.Text = "Start compiling" $Button4.TabIndex = 5 $Button4.BackColor = "white" $Button4.Add_Click({StartCompile}) $Window1.Controls.Add($Button4) $window1.Controls.Add($Label1) $window1.Controls.Add($Label2) $window1.Controls.Add($groupBox1) $window1.Controls.Add($groupBox2) $window1.Controls.Add($groupBox3) $window1.Controls.Add($groupBox4) $window1.Controls.Add($groupBox5) $window1.Controls.Add($groupBox6) [System.Windows.Forms.Application]::Run($Window1) [System.Windows.Forms.Application]::EnableVisualStyles() [System.Windows.Forms.Application]::DoEvents() $Window1.Add_Shown({$Window1.Activate()}) #-EOF-
Mir ist bei meinem GUI Skript aufgefallen, dass das zur PE.exe Datei umgeformte (compiled?) PowerShell.ps1 Skript kein
&-Zeichen im Namen haben darf, ansonsten wird mir eine Fehlermeldung in der PowerShell Konsole ausgegeben.
So weit, so gut...
Ich danke euch schon mal im voraus.
MfG
Alexander :)
Nachtrag: Mein PS2EXE GUI PowerShell Skript funktionier nur mit dem von mir geändertem/verbesserten PS2EXE.ps1 Skript. Vergaß ich zu erwähnen - 'Tschuldigung...
1FM6SfrsPcxMvxSLAJyaeqN15aUSah1cUV
- Bearbeitet Alexander101177 Dienstag, 21. Februar 2017 07:39 Nachtrag zugefügt.
Antworten
-
Also, "schaut einfach mal nach Fehlern" funktioniert hier nicht so gut, wie du bereits gemerkt hast. Du musst dein Script schon selbst testen, kannst aber mit konkreten Fragen oder Fehlern dann gerne kommen. :)
Mit dem Parameter "-lcid" wird das hier gemeint sein: LINK. Da etwas mitzugeben macht aber wahrscheinlich nur Sinn. wenn du das Script für einen Rechner mit anderen Spracheinstellungen packst.
Ansonsten würde ich Fragen die das eigentliche PS2EXE-script bestreffen, direkt auf der Projektseite stellen: LINK
Noch was? Achja du kannst dein Script, wenn es fertig ist, selbstverständlich in die Gallery hochladen: LINK
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Kostenloser Powershell Code Manager v5: Link
(u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.- Bearbeitet Denniver ReiningMVP, Moderator Samstag, 25. Februar 2017 23:39
- Als Antwort markiert Alexander101177 Samstag, 25. Februar 2017 23:43
- Tag als Antwort aufgehoben Alexander101177 Sonntag, 26. Februar 2017 03:45
- Als Antwort markiert Alexander101177 Sonntag, 26. Februar 2017 03:45
-
Eines ist mir beim Überfliegen oben doch aufgefallen und weils was grundsätzliches ist:
Alles was unten nach der Zeile[System.Windows.Forms.Application]::Run($Window1)
steht, wird erst ausgeführt, nachdem du die Form geschlossen hast. Denn nach dieser Zeile, die deine Form anzeigt, reagiert dein Script -solange die Form angezeigt wird- nur noch auf vorher konfigurierte Ereignisse (Events), wie z.b. ein Button-click.
Führe mal diesen Code aus, dann solltest du sehen was ich meine:
$form = New-Object system.Windows.Forms.Form [System.Windows.Forms.Application]::Run($form) Write-Host "hallo"
Die Zeile
[System.Windows.Forms.Application]::EnableVisualStyles()
gehört also noch vor die Zeile mit "run()" und die anderen beiden sind völlig überflüssig, bzw. haben eine Funktion die du in deinem Script nicht brauchst.
Überhaupt solltest du die Initialisierung der Form und Form-Objekte und deinen restlichen Code nicht durcheinander mischen, das macht es sehr unübersichtlich. Sinnvoll ist z.B., erst alle Form Objekte, dann Funktionen, dann sonstigen Code und am Ende deine run()-Zeile.
Beim laden der Assemblies am Anfang reichen auch die ersten zwei:[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
den Rest kannst du weglassen. Und zu guter Letzt kannst du auch die ganzen System.Drawing-Objekte weglassen. Statt:
$Button1.Location = New-Object System.Drawing.Size(50,40)
reicht auch
$Button1.Location = "50,40"
Zur den Basics über Windows-Forms hab ich vor langem mal ein kleines Tutorial geschrieben (LINK) vielleicht hilft das noch beim Verständnis.
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Kostenloser Powershell Code Manager v5: Link
(u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.- Bearbeitet Denniver ReiningMVP, Moderator Sonntag, 26. Februar 2017 01:37
- Als Antwort markiert Alexander101177 Sonntag, 26. Februar 2017 01:38
Alle Antworten
-
Also, "schaut einfach mal nach Fehlern" funktioniert hier nicht so gut, wie du bereits gemerkt hast. Du musst dein Script schon selbst testen, kannst aber mit konkreten Fragen oder Fehlern dann gerne kommen. :)
Mit dem Parameter "-lcid" wird das hier gemeint sein: LINK. Da etwas mitzugeben macht aber wahrscheinlich nur Sinn. wenn du das Script für einen Rechner mit anderen Spracheinstellungen packst.
Ansonsten würde ich Fragen die das eigentliche PS2EXE-script bestreffen, direkt auf der Projektseite stellen: LINK
Noch was? Achja du kannst dein Script, wenn es fertig ist, selbstverständlich in die Gallery hochladen: LINK
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Kostenloser Powershell Code Manager v5: Link
(u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.- Bearbeitet Denniver ReiningMVP, Moderator Samstag, 25. Februar 2017 23:39
- Als Antwort markiert Alexander101177 Samstag, 25. Februar 2017 23:43
- Tag als Antwort aufgehoben Alexander101177 Sonntag, 26. Februar 2017 03:45
- Als Antwort markiert Alexander101177 Sonntag, 26. Februar 2017 03:45
-
Danke dir für deine Antwort, Denniver.
In der Tat habe ich mich etwas gewundert, so lange keine Antwort erhalten zu haben und werde deinen Rat bezüglich des Skriptes auf jeden Fall beherzigen.
Da ich ein "noob" in Sachen PowerShell (und auch ein "Frischling" hier im Forum) bin, war ich mir nicht sicher, ob ich alles richtig mache und ob das Skript soweit in Ordnung ist (ich will ja niemanden Schaden zufügen). Natürlich teste ich das Skript vorher - nur ist auf meinem Rechner Windows 10 installiert und ob es auch unter Windows 8 oder frühere Windows Versionen funktioniert kann ich nicht sagen - da muss ich einmal schauen, ob ich frühere Windows Versionen bekomme und in der VirtualBox vorübergehend zu Testzwecken installiere (meine Mutter hat noch ältere Windows Versionen - eventuell kann sie mir ja dabei hilfreich sein).
Als "Dankeschön" (und für meine "komischen Anfragen") würde ich dem Forum hier gerne ~ 5 Euro (oder etwas mehr für die "Kaffeekasse") in Bitcoins zukommen lassen - falls Ihr hier eine Bitcoinadresse habt und damit auch Einverstanden seid.
Und wenn das Skript "fertig" und durchgetestet ist, lade ich es sehr gerne über den von dir genannten Link in die Gallery hoch (wird aber noch etwas dauern - ich habe auch neuere Versionen von PS2EXE gefunden, und muss noch Testen, ob das Skript auch damit funktioniert).
In diesem Sinne: Einen (hoffentlich) schönen Sonntag euch allen.
MfG
Alexander :)
1FM6SfrsPcxMvxSLAJyaeqN15aUSah1cUV
-
Quark. Glaub mir, auf der "Seltsamkeitsskala" der Fragen die hier im Forum gestellt werden, rangieren deine sehr weit unten. :) Alles gut. Grundsätzlich ist es aber immer gut nur so wenig Code zu posten, wie zum nachstellen eines spezifischen Problems nötig ist. Im Zweifelsfall bei großen Scripten, kannst du versuchen das Problem in einem kleinen Beispielscript nachzustellen. (Möglicherweise findest du dabei sogar schon selbst den Fehler). Insbesondere wenn dir jemand einen Tip gegeben hat, ist es nicht nötig den kompletten Code mit der Änderung nochmal zu posten. ;-) Das macht die Threads nur sehr lang und sehr unübersichtlich.
Was dein Script betrifft, du kannst beim Upload angeben auf welchen Konfigurationen du es getestet hast. Wenn das z.b. nur Windows 10 / Powershell 5 ist, dann ist das eben so. Wenn jemand Interesse hat und es mit einer anderen Konfig Probleme gibt, kann er dir das auf der zu jedem Gallerybeitrag dazugehörigen Diskussionsseite mitteilen. Das ist bei obigen Script aber nicht zu erwarten.Und als "Dank" reicht es völlig, wenn du diese beiden Artikel hier liest und beherzigst: LINK und LINK
Viel Spass noch,
Blog: http://bytecookie.wordpress.com
Kostenloser Powershell Code Manager v5: Link
(u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort. -
Eines ist mir beim Überfliegen oben doch aufgefallen und weils was grundsätzliches ist:
Alles was unten nach der Zeile[System.Windows.Forms.Application]::Run($Window1)
steht, wird erst ausgeführt, nachdem du die Form geschlossen hast. Denn nach dieser Zeile, die deine Form anzeigt, reagiert dein Script -solange die Form angezeigt wird- nur noch auf vorher konfigurierte Ereignisse (Events), wie z.b. ein Button-click.
Führe mal diesen Code aus, dann solltest du sehen was ich meine:
$form = New-Object system.Windows.Forms.Form [System.Windows.Forms.Application]::Run($form) Write-Host "hallo"
Die Zeile
[System.Windows.Forms.Application]::EnableVisualStyles()
gehört also noch vor die Zeile mit "run()" und die anderen beiden sind völlig überflüssig, bzw. haben eine Funktion die du in deinem Script nicht brauchst.
Überhaupt solltest du die Initialisierung der Form und Form-Objekte und deinen restlichen Code nicht durcheinander mischen, das macht es sehr unübersichtlich. Sinnvoll ist z.B., erst alle Form Objekte, dann Funktionen, dann sonstigen Code und am Ende deine run()-Zeile.
Beim laden der Assemblies am Anfang reichen auch die ersten zwei:[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") [void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
den Rest kannst du weglassen. Und zu guter Letzt kannst du auch die ganzen System.Drawing-Objekte weglassen. Statt:
$Button1.Location = New-Object System.Drawing.Size(50,40)
reicht auch
$Button1.Location = "50,40"
Zur den Basics über Windows-Forms hab ich vor langem mal ein kleines Tutorial geschrieben (LINK) vielleicht hilft das noch beim Verständnis.
Grüße, Denniver
Blog: http://bytecookie.wordpress.com
Kostenloser Powershell Code Manager v5: Link
(u.a. Codesnippets verwalten + komplexe Scripte graphisch darstellen)
Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
Warum das Ganze? Hier gibts die Antwort.- Bearbeitet Denniver ReiningMVP, Moderator Sonntag, 26. Februar 2017 01:37
- Als Antwort markiert Alexander101177 Sonntag, 26. Februar 2017 01:38
-
Oh Mann, dank dir Denniver. Hört sich ja fast nach einem "schwerwiegenden" Fehler an. Ich habe grad' erst die Links gelesen und war ein bisschen auf weitere "Information Suche". Ich denke, ich werde da wohl noch eine Menge lernen müssen - aber es macht mir Spaß mit der PowerShell zu Arbeiten.
Bedeutet für mich: Fehler im Skript ausbessern, lesen, lernen, verstehen und anwenden. Gegebenenfalls bei spezifischen Problemen nachfragen, jedoch nicht ohne vorher selbst nach der Lösung gesucht zu haben.
MfG
Alexander :)
1FM6SfrsPcxMvxSLAJyaeqN15aUSah1cUV
- Als Antwort markiert Alexander101177 Sonntag, 26. Februar 2017 03:35
- Tag als Antwort aufgehoben Alexander101177 Sonntag, 26. Februar 2017 03:36
-
Alles klar so weit. Wenn ich dein "Erklärungs-Skript":
$form = New-Object system.Windows.Forms.Form [System.Windows.Forms.Application]::Run($form) Write-Host "hallo"
so ausführe, wird erst die Window angezeigt, und beim beenden (schließen der Window) kommt dann erst der write-host "hallo" Befehl, was mir "hallo" in der Konsole ausgibt.
Schreibe ich jedoch als Skript:
$form = New-Object system.Windows.Forms.Form Write-Host "hallo" [System.Windows.Forms.Application]::Run($form)
wird mir mit öffnen der Window sofort der write-host "hello" Befehl in der Konsole ausgegeben - nicht erst wenn die Window geschlossen wird. Ich denke das es das war, was du meintest (ist ein bisschen komisch von mir erklärt - aber ich weiß was du meinst).
Und auch dein weiterer Tipp funktioniert 1a. Ich habe nur einen kleinen Tippfehler gemacht und anstatt Anführungszeichen die runden Klammern benutzt... das gab mir eine rote Fehlermeldung und alle Buttons wurden oben links auf einen Haufen angezeigt.
Ich habe dies dann auch gleich noch für alle Buttons 1-4 von
$Button1.Size = New-Object System.Drawing.Size(100,70)
in
$Button1.Size = "100,70"
geändert.
MfG
Alexander :)
Edit: Fertig. Download unter https://gallery.technet.microsoft.com/scriptcenter/PS2EXE-GUI-v2017-07-06-0e1569e7
1FM6SfrsPcxMvxSLAJyaeqN15aUSah1cUV
- Bearbeitet Alexander101177 Samstag, 8. Juli 2017 20:20 Download link zum fertigen Produkt.