Установка размера проводника в Windows с помощью пользовательского скрипта Set-Window в Powershell

Установка размера проводника в Windows с помощью пользовательского скрипта Set-Window в Powershell

Я пытаюсь использовать скрипт, указанный в этом ответе. Установка размера и положения окна в PowerShell 5 и 6

для установки высоты и размера нескольких окон проводника Windows. Не Internet Explorer.. файловый браузер называется '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

В идеале я хотел бы иметь сценарий:

  1. откройте 3 окна проводника.
  2. перейти к файлу A,B,C
  3. изменить размер каждого окна в соответствии с определенным местом на экране

Как это сделать, не устанавливая дополнительное программное обеспечение, а просто используя чистый PowerShell?

EDIT: После использования предложения harrymc я решил половину проблемы. Я могу переместить окно, но мне просто нужно выяснить, как получить доступ к 3 дочерним процессам проводника...

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

Редактировать 2:

Я попытался открыть окно проводника через функцию Start-Process, но получаю сообщение об ошибке:

$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

он говорит, что вышел... но окно проводника файлового браузера остается открытым... не уверен, что здесь происходит. Если я попробую это с помощью блокнота, это сработает...

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

Правка 3: Я разобрался с этим, используя ComObject и обращаясь к 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")                                                   

решение1

Это должно быть возможно с использованием собственного API Windows. Что-то вроде этого:

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

Поскольку этот общий код не работает в Explorer, вот альтернативное решение (проверено):

$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

решение2

PowerShell на самом деле не является инструментом автоматизации пользовательского интерфейса. Согласно тому, на что вы указали, почему бы просто не использовать...

UiАвтоматизация

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

Описание Проекта

Модуль UIAutomation упрощает автоматизацию тестирования программного обеспечения при работе над тестами GUI. Основанный на библиотеке UI Automation, которая является частью .Net Framework с версии 3.0, модуль призван максимально облегчить жизнь инженеров-программистов.

ОСА

WASP — это PowerShell snapin для задач автоматизации Windows, таких как выбор окон и элементов управления, а также отправка событий мыши и клавиатуры. У нас есть такие командлеты, как Select-Window, Select-Control, Send-Keys, Send-Click, Get-WindowPosition, Set-WindowPosition, Set-WindowActive, Remove-Window

Примечание: они больше не поддерживаются, но по-прежнему работают так, как задумано, и тот факт, что вы используете пример кода, который никогда не поддерживался и не будет поддерживаться.

См. также это полностью поддерживаемое решение:

АвтоИТ

Новейшие версии языка сценариев AutoIt теперь поставляются с бонусом для пользователей PowerShell. Набором собственных командлетов PowerShell! Это позволяет вам добавлять уникальные возможности AutoIt — управление окнами и имитацию нажатия клавиш — в ваши обычные скрипты PowerShell. В качестве дополнительного бонуса командлеты и сборки AutoIt PowerShell имеют цифровую подпись, поэтому их можно использовать с более строгими политиками выполнения. Командлеты также будут работать в исходном режиме с версиями PowerShell x86 и x64!

Связанный контент