Festlegen der Explorer-Größe in Windows mithilfe des benutzerdefinierten Set-Window-Skripts in Powershell

Festlegen der Explorer-Größe in Windows mithilfe des benutzerdefinierten Set-Window-Skripts in Powershell

Ich versuche, das in dieser Antwort angegebene Skript zu verwenden Festlegen der Fenstergröße und -position in PowerShell 5 und 6

um die Höhe und Größe mehrerer Windows Explorer-Fenster festzulegen. Nicht der Internet-Explorer, sondern der Dateibrowser namens „Explorer“.

es funktioniert mit dem Programm „Notepad“, aber nicht mit dem Programm „Explorer“.

#works
Set-Window -ProcessName notepad-X 400 -Y 400 -Width 400 -Height 700 

#doesnt work
Set-Window -ProcessName explorer -X 400 -Y 400 -Width 400 -Height 700

idealerweise hätte ich gerne ein Skript:

  1. Öffnen Sie 3 Explorer-Fenster.
  2. Navigieren Sie zum Dateipfad A, B, C.
  3. Passen Sie die Größe jedes Fensters an eine bestimmte Position auf dem Bildschirm an.

Wie kann ich dies tun, ohne zusätzliche Software zu installieren und hier einfach die reine Powershell zu verwenden?

BEARBEITEN: Nachdem ich den Vorschlag von harrymc befolgt habe, bin ich mit dem Problem zur Hälfte fertig. Ich kann das Fenster verschieben, muss aber noch herausfinden, wie ich an den Handle von drei Explorer-Unterprozessen komme …

$MethodDefinition = @'
[DllImport("user32.dll")]
public extern static bool MoveWindow(IntPtr handle, int x, int y, int width, int height, bool redraw);
'@

$Kernel32 = Add-Type -MemberDefinition $MethodDefinition -Name 'Kernel32' -Namespace 'Win32' -PassThru

# How do I get 3 child explorer IDs here?
# i can't pass in 'explorer' name because that references the parent process running the whole GUI
$Handle = (Get-Process -Name "notepad").MainWindowHandle

$Return = [Window]::MoveWindow($Handle, 10, 20, 400, 400,$True)

Bearbeitung 2:

Ich habe versucht, das Explorer-Fenster über die Funktion „Start-Process“ aufzurufen, erhalte jedoch eine Fehlermeldung:

$er3 = (Start-Process explorer -passthru)

PS C:\> (Get-Process -Id $er3.Id).MainWindowHandle
Get-Process : Cannot find a process with the process identifier 10572.At line:1 char:2
+ (Get-Process -Id $er3.Id).MainWindowHandle
+  ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (10572:Int32) [Get-Process], ProcessCommandException
    + FullyQualifiedErrorId : NoProcessFoundForGivenId,Microsoft.PowerShell.Commands.GetProcessCommand

es heißt, es sei beendet worden ... aber das Explorer-Dateibrowserfenster bleibt geöffnet ... nicht sicher, was hier los ist. Wenn ich es mit Notepad versuche, funktioniert es ...

$er4 = (Start-Process notepad -passthru)
PS C:\> (Get-Process -Id $er4.Id).MainWindowHandle
9899994

Bearbeitung 3: Ich habe es mithilfe des ComObjects und dem Zugriff auf Element (0) herausgefunden.

$ex4 = New-Object -ComObject Shell.Application
$ex4.open("C:\")
# $ex4.windows()[0].Width = 400       # breaks
$ex5 = $ex4.Windows()[0]
$ex6 = $ex5.Item(0)              # not sure why i need to do this extra step
$ex6.Width = 400 
$ex6.Navigate("file:///C:/Folder1/Folder2")                                                   

Antwort1

Dies sollte mithilfe der nativen Windows-API möglich sein. Etwa so:

[DllImport("User32.dll")]
public extern static bool MoveWindow(IntPtr handle, int x, int y, int width, int height, bool redraw);
...
$Handle = (Get-Process -Id $ProcessId).MainWindowHandle
$Return = [Window]::MoveWindow($Handle, $x, $y, $Width, $Height,$True)

Da dieser allgemeine Code für den Explorer nicht funktioniert, hier eine alternative Lösung (getestet):

$ex1 = New-Object -ComObject Shell.Application
$ex1.open("C:\")
$ex1.windows()[0].Top = 10
# also assignable : Left, Width, Height
# if required : $handle = $ex1.windows()[0].HWND

Antwort2

PowerShell ist eigentlich kein Tool zur UI-Automatisierung. Wie Sie bereits erwähnt haben, warum verwenden Sie nicht einfach ...

Benutzeroberflächenautomatisierung

$w = Get-UIAWindow -ProcessName notepad
$w.Move(100, 100)

Projektbeschreibung

Das UIAutomation-Modul vereinfacht die Automatisierung von Softwaretests, wenn Sie an GUI-Tests arbeiten. Das Modul basiert auf der UI Automation-Bibliothek, die seit 3.0 Teil des .Net Frameworks ist, und soll Softwareentwicklern das Leben so einfach wie möglich machen.

WESPE

WASP ist ein PowerShell-Snap-In für Windows-Automatisierungsaufgaben wie das Auswählen von Fenstern und Steuerelementen sowie das Senden von Maus- und Tastaturereignissen. Wir haben Cmdlets wie Select-Window, Select-Control, Send-Keys, Send-Click, Get-WindowPosition, Set-WindowPosition, Set-WindowActive, Remove-Window

Hinweis: Diese werden nicht mehr gewartet, funktionieren aber noch wie vorgesehen und Sie verwenden Beispielcode, der nie gewartet wurde oder jemals gewartet werden wird.

Sehen Sie sich auch diese vollständig gepflegte Lösung an:

AutoIT

Die neuesten Versionen der AutoIt-Skriptsprache bieten jetzt einen Bonus für PowerShell-Benutzer: einen Satz nativer PowerShell-Cmdlets! Damit können Sie die einzigartigen Funktionen von AutoIt – Fenstermanipulation und Tastenanschlagsimulation – zu Ihren üblichen PowerShell-Skripten hinzufügen. Als zusätzlicher Bonus sind die AutoIt PowerShell-Cmdlets und -Assemblys digital signiert, sodass sie mit den strengeren Ausführungsrichtlinien verwendet werden können. Die Cmdlets laufen auch nativ mit den x86- und x64-Versionen von PowerShell!

verwandte Informationen