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:
- abre 3 ventanas del explorador.
- navegar a la ruta del archivo A,B,C
- 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...
$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.
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:
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!