Powershell lernen Frage (Vergleich Powershell 7 und Windows Powershell)?

2 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

schon mal mit der Richtigen Syntax probiert?

Get-Process |
    Where-Object {$_.MainWindowHandle -ne 0}|
    Select-Object Name, MainWindowHandle 

oder kurz:

gps|?{$_.MainWindowHandle -ne 0}|select Name, MainWindowHandle

Einzig der Umstand, das Posh 7 etwas toleranter gegenüber "schlechter" Syntax ist lässt Deinen Code funktionieren. (syntaktischer Zucker)

  • Die AutomatikVariable $_ enthält das aktuelle Objekt. $_.MainWindowHandle gibt den Wert der Property MainWindowHandle des Objekts an
  • eher eine kleine "Unschönheit" ist die Reihenfolge, kann aber bei sehr großen Datenmengen zum Flaschenhals werden. . deshalb erst die menge der Objekte reduzieren und dann diese verändern.
  • Das MainwindowHandle ist eine Variable vom Type IntPtr . (Posh5.1 verwendet im Gegensatz zu 7 die IntPtr-Implementation von Framework 4.6!!! Da ist kann nicht mit größer oder kleiner verglichen werden! es ist aber möglich zu prüfen ob der Pointer den Wert 0 hat (oder nicht).

Beim Programmieren sollte man möglichst die Syntax so wählen, dass es auf einer Standardinstallation funktioniert. Posh7 ist kein Systemstandard.

Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren
DNSxxx 
Fragesteller
 01.02.2023, 07:03

Vielen Dank für deine ausführliche Erklärung.

Der Code (inkl. Syntax) steht so in einem Powershell Buch, dass Windows Powershell und Powershell 7 miteinander erklärt. An vielen Stellen wird auch auf die Unterschiede hingewiesen. An dieser Stelle wurde wohl ein "Problemchen" übersehen.

Da dies so in einem Buch stand dachte ich zuerst, dass der Fehler wie meistens vor dem PC sitzt.

Vielen Dank nochmal für die tolle Unterstützung.

0
Erzesel  01.02.2023, 12:21
@DNSxxx

WindowHandles (HWnd) gehören eigentlich eher in die Sparte C++/C#-PInvoke. Dergleichen gehört nicht unbedingt in die Welt von Powershellprogrammierern...

Hier mal eine kleine kleine Demo zur Manipulation von Fenstereigenschaften:

#https://learn.microsoft.com/en-us/windows/win32/winmsg/window-styles
[Flags()] enum WindowStyles {
    WS_BORDER = 0x800000
    WS_CAPTION = 0xc00000
    WS_CHILD = 0x40000000
    WS_CLIPCHILDREN = 0x2000000
    WS_CLIPSIBLINGS = 0x4000000
    WS_DISABLED = 0x8000000
    WS_DLGFRAME = 0x400000
    WS_GROUP = 0x20000
    WS_HSCROLL = 0x100000
    WS_MAXIMIZE = 0x1000000
    WS_MAXIMIZEBOX = 0x10000
    WS_MINIMIZE = 0x20000000
    WS_MINIMIZEBOX = 0x20000
    WS_OVERLAPPED = 0x0
    WS_POPUP = 0x80000000
    WS_THICKFRAME = 0x40000
    WS_SYSMENU = 0x80000
    WS_TABSTOP = 0x10000
    WS_VISIBLE = 0x10000000
    WS_VSCROLL = 0x200000
    WS_OVERLAPPEDWINDOW = 0 -bor 0xc00000 -bor 0x80000 -bor 0x40000 -bor 0x20000 -bor 0x10000
    WS_POPUPWINDOW = 0x80000000 -bor 0x800000 -bor 0x80000
}

#https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-setwindowlonga
[Flags()] enum GWL{
    GWL_WNDPROC = -4
    GWL_HINSTANCE = -6
    GWL_HWNDPARENT = -8
    GWL_STYLE = -16
    GWL_EXSTYLE = -20
    GWL_USERDATA = -21
    GWL_ID = -12
}

#andere Flags  in diesem Zusammenhang:
#https://learn.microsoft.com/en-us/windows/win32/winmsg/extended-window-styles


$NativeFuncs = @(
    '[DllImport("user32.dll", SetLastError = true)]public static extern int GetWindowLong(IntPtr hWnd, int nIndex);', 
    '[DllImport("user32.dll")]public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);' 
)
$User32 = Add-Type -MemberDefinition $NativeFuncs -Name Win32Util -Passthru

$MainWindowHandle = ([system.diagnostics.process]::GetCurrentProcess()).MainWindowHandle  # Handle auf "dieses" Fenster

$OriganalStyle = $User32::GetWindowLong($MainWindowHandle,[GWL]::GWL_STYLE)
$Borderles = $OriganalStyle -band (-bnot([WindowStyles]::WS_CAPTION -bor [WindowStyles]::WS_THICKFRAME ))

Write-Host 'Titelleiste ausschalten in 2 Sekunden:' -fo red
sleep 2
$Null=$User32::SetWindowLong($MainWindowHandle,[GWL]::GWL_STYLE, $Borderles)
Write-Host 'Titelleiste einschalten in 2 Sekunden:' -fo green
sleep 2
$Null=$User32::SetWindowLong($MainWindowHandle,[GWL]::GWL_STYLE, $OriganalStyle)
pause

1
DNSxxx 
Fragesteller
 01.02.2023, 18:57
@Erzesel

Nochmals Danke.

Faszinierend was du auf die schnelle zusammenbasteln kannst.

Vielleicht hättest du den Buchautor unterstützen sollen :)

0

Windows Powershell (5.x) basiert auf dem .NET-Framework 4.5, Powershell 7.x hingegen auf .NET Core 2.0

Die Unterschiede der beiden Versionen sind also in den Unterschieden im darunterliegenden .NET-Framework zu finden.