Configurando o tamanho do explorador em janelas usando o script Set-Window personalizado no Powershell

Configurando o tamanho do explorador em janelas usando o script Set-Window personalizado no Powershell

Estou tentando usar o script fornecido nesta resposta Configurando o tamanho e a posição da janela no PowerShell 5 e 6

para definir a altura e o tamanho de várias janelas do Windows Explorer. Não o explorador da Internet.. o navegador de arquivos chamado 'explorador'.

funciona com o programa 'bloco de notas'. mas não com o programa '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

idealmente, eu gostaria de ter um script:

  1. abra 3 janelas do explorador.
  2. navegue até o caminho do arquivo A, B, C
  3. redimensionar cada janela para um local específico na tela

Como posso fazer isso sem instalar nenhum software extra e apenas usar o PowerShell bruto aqui?

EDIT: Depois de usar a sugestão de harrymc, cheguei na metade do problema. Posso mover a janela, mas só preciso descobrir como lidar com três processos filhos do Explorer...

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

Editar 2:

Tentei obter a janela do Explorer por meio da função Start-Process, mas estou recebendo um erro:

$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

diz que saiu... mas a janela do navegador de arquivos do explorer permanece aberta... não tenho certeza do que está acontecendo aqui. Se eu tentar com o bloco de notas, funciona ...

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

Edição 3: descobri usando o ComObject e acessando o item (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")                                                   

Responder1

Deve ser possível usando a API nativa do Windows. Algo assim:

[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 geral não funciona para o Explorer, aqui está uma solução alternativa (testada):

$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

Responder2

O PowerShell não é realmente uma ferramenta de automação de UI. De acordo com o que você apontou, por que não usar ...

UiAutomação

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

Descrição do Projeto

O módulo UIAutomation simplifica a automação de testes de software quando você está trabalhando em testes de GUI. Baseado na biblioteca UI Automation que faz parte do .Net Framework desde 3.0, o módulo tem como objetivo tornar a vida dos engenheiros de software o mais fácil possível.

VESPA

WASP é um snap-in do PowerShell para tarefas de automação do Windows, como selecionar janelas e controles e enviar eventos de mouse e teclado. Temos cmdlets como Select-Window, Select-Control, Send-Keys, Send-Click, Get-WindowPosition, Set-WindowPosition, Set-WindowActive, Remove-Window

Observação: eles não são mais mantidos, mas ainda funcionam conforme projetado e o fato de você estar usando um código de exemplo que nunca foi ou será mantido.

Veja também esta solução totalmente mantida:

AutoIT

As versões mais recentes da linguagem de script AutoIt agora vêm com um bônus para usuários do PowerShell. Um conjunto de cmdlets nativos do PowerShell! Isso permite que você adicione os recursos exclusivos do AutoIt – manipulação de janelas e simulação de pressionamento de teclas – aos seus scripts habituais do PowerShell. Como um bônus adicional, os cmdlets e assemblies do AutoIt PowerShell são assinados digitalmente para que possam ser usados ​​com políticas de execução mais rigorosas. Os Cmdlets também serão executados nativamente com versões x86 e x64 do PowerShell!

informação relacionada