Configuración del tamaño del explorador en Windows usando el script de configuración de ventana personalizado en Powershell

Configuración del tamaño del explorador en Windows usando el script de configuración de ventana personalizado en Powershell

Estoy intentando usar el script que figura en esta respuesta. Configuración del tamaño y la posición de la ventana en PowerShell 5 y 6

para establecer la altura y el tamaño de varias ventanas del Explorador de Windows. No el explorador de Internet... el explorador de archivos llamado 'explorador'.

Funciona con el programa 'Bloc de notas'. pero no con el programa 'explorador'.

#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

Lo ideal sería tener un guión:

  1. abre 3 ventanas del explorador.
  2. navegar a la ruta del archivo A,B,C
  3. cambiar el tamaño de cada ventana a una ubicación específica en la pantalla

¿Cómo puedo hacer esto sin instalar ningún software adicional y simplemente usar PowerShell sin formato aquí?

EDITAR: Después de usar la sugerencia de harrymc, llegué a la mitad del problema. Puedo mover la ventana, pero solo necesito descubrir cómo manejar 3 procesos secundarios del explorador...

$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)

Edición 2:

Intenté abrir la ventana del explorador a través de la función Iniciar proceso pero recibo un error:

$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

dice que ha salido... pero la ventana del explorador de archivos permanece abierta... no estoy seguro de qué está pasando aquí. Si lo pruebo con el bloc de notas funciona...

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

Edición 3: lo descubrí usando ComObject y accediendo al elemento (0).

$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")                                                   

Respuesta1

Debería ser posible utilizando la API nativa de Windows. Algo como esto:

[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)

Como este código general no funciona para Explorer, aquí hay una solución alternativa (probada):

$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

Respuesta2

PowerShell en realidad no es una herramienta de automatización de la interfaz de usuario. Según lo que usted señaló, ¿por qué no simplemente usar...

UIAutomatización

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

Descripción del Proyecto

El módulo UIAutomation simplifica la automatización de las pruebas de software cuando se trabaja en pruebas de GUI. Basado en la biblioteca UI Automation que forma parte de .Net Framework desde 3.0, el módulo está destinado a hacer la vida de los ingenieros de software lo más fácil posible.

AVISPA

WASP es un complemento de PowerShell para tareas de automatización de Windows, como seleccionar ventanas y controles y enviar eventos de mouse y teclado. Tenemos cmdlets como Select-Window, Select-Control, Send-Keys, Send-Click, Get-WindowPosition, Set-WindowPosition, Set-WindowActive, Remove-Window

Nota: Estos ya no se mantienen, pero aún funcionan según lo diseñado y el hecho de que está utilizando un código de muestra que nunca se ha mantenido ni se mantendrá.

Vea también esta solución totalmente mantenida:

AutoIT

Las versiones más recientes del lenguaje de scripting AutoIt ahora vienen con una ventaja para los usuarios de PowerShell. ¡Un conjunto de cmdlets nativos de PowerShell! Esto le permite agregar las características únicas de AutoIt (manipulación de ventanas y simulación de pulsaciones de teclas) a sus scripts habituales de PowerShell. Como beneficio adicional, los cmdlets y ensamblajes de AutoIt PowerShell están firmados digitalmente para que puedan usarse con las políticas de ejecución más estrictas. ¡Los cmdlets también se ejecutarán de forma nativa con las versiones x86 y x64 de PowerShell!

información relacionada