timsen-96
Goto Top

PowerShell Auflösung zu .txt (Skript als exe) falsche Auflösung?!

Ich habe folgendes Skript um die Bildschirmauflösung herauszufinden, was auch in PowerShell super funktioniert:
Add-Type -AssemblyName System.Windows.Forms
$Width = "{0}" -f [System.Windows.Forms.SystemInformation]::PrimaryMonitorSize.Width
$Height = "{0}" -f [System.Windows.Forms.SystemInformation]::PrimaryMonitorSize.Height
"Width = $Width
Height = $Height" >> .\Auflösung.txt

Ausgabe:
Width = 2560
Height = 1440

Ich möchte dieses Script gerne als exe haben und habe es mit ps1 to exe konvertieren lassen, das Ergebnis sieht dann so aus.

Ausgabe:
Width = 2048
Height = 1152

Kann mir jemand sagen wieso das so ist, und wie ich das Script als exe bekomme das auch die Ausgabe richtig ist?

-timsen-96

Content-Key: 380614

Url: https://administrator.de/contentid/380614

Ausgedruckt am: 19.03.2024 um 09:03 Uhr

Mitglied: erikro
erikro 18.07.2018 um 15:04:39 Uhr
Goto Top
Moin,

warum nimmst Du System.Windows.Forms? Das geht auch einfacher:

Get-WmiObject win32_desktopmonitor | Select-Object screenheight, screenwidth

oder

 wmic desktopmonitor get screenheight
 wmic desktopmonitor get screenwidth



Liebe Grüße

Erik
Mitglied: timsen-96
timsen-96 18.07.2018 um 15:21:52 Uhr
Goto Top
Und wie kriege ich es dann in eine txt Datei?
Mitglied: H41mSh1C0R
H41mSh1C0R 18.07.2018 um 15:26:54 Uhr
Goto Top
Ergebnis nach Out-File pipen und fertisch. =)
Mitglied: erikro
erikro 18.07.2018 um 15:28:35 Uhr
Goto Top
Moin,

na so:

PS P:\> Get-WmiObject win32_desktopmonitor | Select-Object ScreenHeight, ScreenWidth | Format-List | out-file .\test.txt
 -append -encoding utf8

hth

Erik
Mitglied: timsen-96
timsen-96 18.07.2018 um 15:38:24 Uhr
Goto Top
Dann kommt eine Fehlermeldung:
Es wurde kein Positionsparameter gefunden, der das Argument "Get-WmiObject" akzeptiert.

Und wie kann ich dann die einzelnen Zahlen wie oben mit $Width und $Height in einer txt Datei an einer bestimmten Position erstellen lassen?

MfG
Mitglied: erikro
erikro 18.07.2018 um 15:59:51 Uhr
Goto Top
Moin,


Zitat von @timsen-96:

Dann kommt eine Fehlermeldung:
Es wurde kein Positionsparameter gefunden, der das Argument "Get-WmiObject" akzeptiert.

Was genau hast Du eingegeben bzw. was steht in Deinem Skript?

Und wie kann ich dann die einzelnen Zahlen wie oben mit $Width und $Height in einer txt Datei an einer bestimmten Position erstellen lassen?

Was genau möchtest Du tun? Bei meiner Lösung steht die Zahl als neue Zeile in der Ausgabedatei.

Liebe Grüße

Erik
Mitglied: timsen-96
timsen-96 18.07.2018 um 16:21:56 Uhr
Goto Top
Genau das was du geschrieben hast.

Ich würde gerne die Möglichkeit haben die einzelnen Angaben wie auch in meiner Frage oben steht mit $Height und $Width individuell einsetzen zu können, für verschiedene Scripte. Deshalb fand ich die Methode die in meiner Frage ist relativ gut dafür, nur die Frage ist wieso werden die Daten geändert wenn ich es in einer exe konvertiere?

MfG
Mitglied: erikro
erikro 18.07.2018 um 16:36:17 Uhr
Goto Top
Moin,

Zitat von @timsen-96:

Genau das was du geschrieben hast.

Nö, denn dann käme nicht diese Fehlermeldung. Die kommt nur dann, wenn Du vorher einen anderen Befehl hast, der einen Positionsparameter erwartet, zu dem get-wmiObject nicht passt.


Ich würde gerne die Möglichkeit haben die einzelnen Angaben wie auch in meiner Frage oben steht mit $Height und $Width individuell einsetzen zu können, für verschiedene Scripte.

Nö, da steht, dass Du das in eine Textdatei schreiben willst. Von Weiterverarbeiten steht da nichts. Aber auch das ist kein Problem:

$height = $(get-wmiObject win32_desktopmonitor).screenheigth
$width = $(get-wmiObject win_32_desktopmonitor).screenwidth

Jetzt stehen die beiden Zahlen nackig in den beiden Variablen und Du kannst damit machen, was Du willst.

Nochmal: Die Methode, das über den Form-Konstruktor zu machen, ist einfach ungeeignet. Die ist dafür gedacht, dass Du Formulare an die Bildschirmauflösung anpassen kannst.

Liebe Grüße

Erik
Mitglied: timsen-96
timsen-96 18.07.2018 um 16:47:13 Uhr
Goto Top
Entschuldigung dann habe ich mich wohl falsch ausgedrückt.

Danke für die Hilfe, nur leider bekomme ich jetzt folgendes:
get-wmiObject : Ungültige Klasse "win_32_desktopmonitor"

MfG
Mitglied: H41mSh1C0R
H41mSh1C0R 18.07.2018 aktualisiert um 17:59:25 Uhr
Goto Top
öhmm lass den Unterstrich weg hinter win --> "win32_desktopmonitor"

Ein Bissel mitdenken ist schon erforderlich, nicht nur copy und paste, sonst lernst du nix.

VG
Mitglied: timsen-96
timsen-96 18.07.2018 um 18:17:10 Uhr
Goto Top
Okay es kommt keine Fehlermeldung mehr, aber in der Textdatei fehlen die Zahlen der Auflösung.
Ich versuche das ganze zu verstehen, bin noch kompletter Anfänger.
Mitglied: SeaStorm
SeaStorm 18.07.2018 um 21:57:05 Uhr
Goto Top
Hi

Darüber funktioniert das nur bei einem einzelnen Monitor. Bei einem Multi Monitor Setup braucht man offenbar WinForms
Add-Type -AssemblyName System.Windows.Forms
$Monitors = [System.Windows.Forms.Screen]::AllScreens

foreach ($Monitor in $Monitors)
{
	$DeviceName = (($Monitor.DeviceName).replace("\", "")).replace(".", "")  
	$Width = $Monitor.bounds.Width
	$Height = $Monitor.bounds.Height
	Write-Host "$DeviceName - $Width x $height"  
}
von https://social.technet.microsoft.com/Forums/lync/en-US/219cf510-2c8d-431 ... geklaut
Mitglied: timsen-96
timsen-96 18.07.2018 um 22:59:12 Uhr
Goto Top
Da habe ich leider das gleiche Problem wie bei der Methode die ganz am Anfang hatte und zwar wird der Hauptmonitor (2560x1440) als 2048x1152 angezeigt!

MfG
Mitglied: colinardo
Lösung colinardo 19.07.2018 aktualisiert um 07:29:37 Uhr
Goto Top
Zitat von @timsen-96:

Da habe ich leider das gleiche Problem wie bei der Methode die ganz am Anfang hatte und zwar wird der Hauptmonitor (2560x1440) als 2048x1152 angezeigt!
Ganz einfach, deine Skalierung steht nicht auf 100%, odr du hast ein HighDPI Monitor, der Output liefert dir immer die skalierte Auflösung entsprechend deiner Einstellung.
https://stackoverflow.com/questions/35963727/powershell-script-returning ...
Da nicht jede Anwendung DPI-Aware ist sind die Ergebnisse in unterschiedlichen Hostumgebungen auch unterschiedlich. That's the reason.
https://powershell.org/forums/topic/how-to-get-screen-resolution-with-dp ...
http://james-ramsden.com/c-get-dpi-screen/

Grüße Uwe
Mitglied: erikro
erikro 19.07.2018 um 11:31:46 Uhr
Goto Top
Zitat von @H41mSh1C0R:

öhmm lass den Unterstrich weg hinter win --> "win32_desktopmonitor"

Ooops! Da macht man es einmal nicht so, dass man es testet und aus der Konsole kopiert und schon passiert's. Tschulligung!
Mitglied: timsen-96
timsen-96 19.07.2018 um 14:56:09 Uhr
Goto Top
Zitat von @colinardo:
Ganz einfach, deine Skalierung steht nicht auf 100%, odr du hast ein HighDPI Monitor, der Output liefert dir immer die skalierte Auflösung entsprechend deiner Einstellung.
https://stackoverflow.com/questions/35963727/powershell-script-returning ...
Da nicht jede Anwendung DPI-Aware ist sind die Ergebnisse in unterschiedlichen Hostumgebungen auch unterschiedlich. That's the reason.
https://powershell.org/forums/topic/how-to-get-screen-resolution-with-dp ...
http://james-ramsden.com/c-get-dpi-screen/

Grüße Uwe

Wow vielen Dank, genau daran liegt es, ich habe die Skalierung auf 125%.
An sowas habe ich nicht gedacht.
Gibt es denn eine Möglichkeit das man den "normalen" Wert raus bekommt auch wenn man eine Skalierung hat die nicht auf 100% ist?

MfG
Mitglied: colinardo
colinardo 19.07.2018 aktualisiert um 15:05:18 Uhr
Goto Top
Steht in den Threads.

Z.B. mit
gwmi win32_VideoController | %{"$($_.CurrentHorizontalResolution)x$($_.CurrentVerticalResolution)"} | out-file 'D:\resolution.txt'  
Mitglied: timsen-96
timsen-96 19.07.2018 aktualisiert um 15:42:46 Uhr
Goto Top
Zitat von @colinardo:

Steht in den Threads.

Z.B. mit
> gwmi win32_VideoController | %{"$($_.CurrentHorizontalResolution)x$($_.CurrentVerticalResolution)"} | out-file 'D:\resolution.txt'  
> 

Dabei kommt 1920x1080 bei raus. Wie kann ich da den Monitor angeben der als 1.Stelle in den Windows Einstellungen angegeben ist?

MfG
Mitglied: colinardo
Lösung colinardo 19.07.2018, aktualisiert am 20.07.2018 um 07:21:34 Uhr
Goto Top
Add-Type -A System.Windows.Forms
Add-Type @'  
  using System; 
  using System.Runtime.InteropServices;
  using System.Drawing;

  public class DPI {  
    [DllImport("gdi32.dll")]  
    static extern int GetDeviceCaps(IntPtr hdc, int nIndex);

    public enum DeviceCap {
      VERTRES = 10,
      DESKTOPVERTRES = 117
    } 

    public static float scaling() {
      Graphics g = Graphics.FromHwnd(IntPtr.Zero);
      IntPtr desktop = g.GetHdc();
      int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES);
      int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES);

      return (float)PhysicalScreenHeight / (float)LogicalScreenHeight;
    }
  }
'@ -ReferencedAssemblies 'System.Drawing.dll'  
$ratio = [Math]::round([DPI]::scaling(), 2)
$size = [System.Windows.Forms.SystemInformation]::PrimaryMonitorSize
$height = [int]($size.Height * $ratio)
$width = [int]($size.Width * $ratio)
"$width x $height"  
Mitglied: timsen-96
timsen-96 19.07.2018 um 19:24:21 Uhr
Goto Top
Zitat von @colinardo:

> Add-Type @'  
>   using System; 
>   using System.Runtime.InteropServices;
>   using System.Drawing;
> 
>   public class DPI {  
>     [DllImport("gdi32.dll")]  
>     static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
> 
>     public enum DeviceCap {
>       VERTRES = 10,
>       DESKTOPVERTRES = 117
>     } 
> 
>     public static float scaling() {
>       Graphics g = Graphics.FromHwnd(IntPtr.Zero);
>       IntPtr desktop = g.GetHdc();
>       int LogicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.VERTRES);
>       int PhysicalScreenHeight = GetDeviceCaps(desktop, (int)DeviceCap.DESKTOPVERTRES);
> 
>       return (float)PhysicalScreenHeight / (float)LogicalScreenHeight;
>     }
>   }
> '@ -ReferencedAssemblies 'System.Drawing.dll'  
> $ratio = [Math]::round([DPI]::scaling(), 2)
> $size = [System.Windows.Forms.SystemInformation]::PrimaryMonitorSize
> $height = [int]($size.Height * $ratio)
> $width = [int]($size.Width * $ratio)
> "$width x $height"  
> 
Das funktioniert perfekt! Danke!
Habe das Skript jetzt in eine exe konvertiert, da kommt dann aber leider nur 0x0 bei raus.
Könntest du mir eventuell noch eine Möglichkeit sagen wie ich aus dem Skript eine funktionstüchtige exe bekomme?
Und warum ist das so, dass es als exe nicht mehr funktioniert?
Falls dies nicht möglich sein sollte, gäbe es noch eine andere Möglichkeit als eine exe (Nur im Fall wenn es keine Möglichkeit per exe gibt)?

MfG
Mitglied: Mikrofonpartner
Mikrofonpartner 19.07.2018 um 22:20:14 Uhr
Goto Top
Mit welchem Programm hast du denn das Script als exe kompilieren lassen?
Mitglied: colinardo
colinardo 19.07.2018 aktualisiert um 22:34:17 Uhr
Goto Top
Zitat von @Mikrofonpartner:

Mit welchem Programm hast du denn das Script als exe kompilieren lassen?
Dito, die meisten so rumfliegenden Wrapper taugen nüscht.
Warum nicht gleich in c# schreiben? Überflüssiger Balast fällt dann gleich auch weg ...
Mitglied: Mikrofonpartner
Mikrofonpartner 19.07.2018 um 22:43:33 Uhr
Goto Top
https://gallery.technet.microsoft.com/scriptcenter/PS2EXE-GUI-Convert-e7 ...

Warum nicht gleich das inoffizielle MS-Tool aus der Gallery verwenden?
Mitglied: timsen-96
timsen-96 19.07.2018 um 23:06:14 Uhr
Goto Top
Zitat von @Mikrofonpartner:

https://gallery.technet.microsoft.com/scriptcenter/PS2EXE-GUI-Convert-e7 ...

Warum nicht gleich das inoffizielle MS-Tool aus der Gallery verwenden?
Hab ich schon probiert, da ist das gleiche Problem wie bei dem was ich verwende (www.f2ko.de/de/p2e.php) und zwar hab ich am Ende dann wieder 2048x1152.

MfG
Mitglied: Mikrofonpartner
Mikrofonpartner 19.07.2018 aktualisiert um 23:30:58 Uhr
Goto Top
Interessante Seite. Direkt beim Aufruf

Der Download wurde verboten.;https: //authedmine. com/lib/authedmine.min.js;not-a-virus:HEUR:RiskTool.Script.Miner.heur;https://authedmine.com/lib/authedmine.min.js;Firefox;Legales Programm, mit dem Angreifer den Computer oder die Benutzerdaten beschädigen können;07/19/2018 23:10:42

edit: Hab das Script von Uwe grade bei mir auf meinem PC ausgeführt. Nur ein Display ist in FullHD im Einsatz. Sowohl das Script, als auch die Exe (kompiliert mit PS2EXE-GUI) zeigt mit 1920x1080 an.
Mitglied: timsen-96
timsen-96 19.07.2018 um 23:15:53 Uhr
Goto Top
Zitat von @colinardo:

Zitat von @Mikrofonpartner:

Mit welchem Programm hast du denn das Script als exe kompilieren lassen?
Dito, die meisten so rumfliegenden Wrapper taugen nüscht.
Warum nicht gleich in c# schreiben? Überflüssiger Balast fällt dann gleich auch weg ...
Ich würde es ja gerne selber in c# schreiben, wenn ich´s könnte^^
Das bedeutet wohl das mein Vorhaben (Die Bildschirmauflösung egal was für eine Skalierung verwendet wird, individuell in einer txt Datei eintragen zu lassen, als exe Datei) so nicht machbar ist.
Obwohl das Problem nicht unbedingt an der Konvertierung liegt, weil wenn ich das Script mit Windows Power Shell öffne, also nicht mit ISE dann habe ich genau das gleiche Problem.

MfG
Mitglied: colinardo
Lösung colinardo 20.07.2018 aktualisiert um 09:55:31 Uhr
Goto Top
Zitat von @timsen-96:
Ich würde es ja gerne selber in c# schreiben, wenn ich´s könnte^^
Ganz einfach, hinsetzen und lernen. Die hälfte hast du oben schon als C# face-wink. Der Rest ist Pippifax und zu 99,9 % gleich wie in Powershell.
Das bedeutet wohl das mein Vorhaben (Die Bildschirmauflösung egal was für eine Skalierung verwendet wird, individuell in einer txt Datei eintragen zu lassen, als exe Datei) so nicht machbar ist.
Doch siehe, everything the same:

Der Bildschirm wird nativ bei 1282 x 1049 betrieben, dort ist im Beispiel eine Skalierung von 125% aktiv, bei allen Methoden als PS1, EXE oder in der ISE konsistente Ausgaben :

screenshot

screenshot

Obwohl das Problem nicht unbedingt an der Konvertierung liegt, weil wenn ich das Script mit Windows Power Shell öffne, also nicht mit ISE dann habe ich genau das gleiche Problem.
Entweder du erzählst uns hier was vom Pferd, oder wir kennen deine Umgebung und deinen installierten Ramsch nicht... face-smile

That's it, works as designed.
Grüße Uwe
Mitglied: timsen-96
timsen-96 20.07.2018 um 12:08:09 Uhr
Goto Top
Zitat von @colinardo:

Zitat von @timsen-96:
Ich würde es ja gerne selber in c# schreiben, wenn ich´s könnte^^
Ganz einfach, hinsetzen und lernen. Die hälfte hast du oben schon als C# face-wink. Der Rest ist Pippifax und zu 99,9 % gleich wie in Powershell.
Das bedeutet wohl das mein Vorhaben (Die Bildschirmauflösung egal was für eine Skalierung verwendet wird, individuell in einer txt Datei eintragen zu lassen, als exe Datei) so nicht machbar ist.
Doch siehe, everything the same:

Der Bildschirm wird nativ bei 1282 x 1049 betrieben, dort ist im Beispiel eine Skalierung von 125% aktiv, bei allen Methoden als PS1, EXE oder in der ISE konsistente Ausgaben :

screenshot

screenshot

Obwohl das Problem nicht unbedingt an der Konvertierung liegt, weil wenn ich das Script mit Windows Power Shell öffne, also nicht mit ISE dann habe ich genau das gleiche Problem.
Entweder du erzählst uns hier was vom Pferd, oder wir kennen deine Umgebung und deinen installierten Ramsch nicht... face-smile

That's it, works as designed.
Grüße Uwe
Okay, keine Ahnung was ich gestern falsch gemacht habe aber jetzt funktioniert es problemlos!
Vielen lieben Dank für die ganze Hilfe!!

MfG