Powershell에서 Custom Set-Window 스크립트를 사용하여 창에서 탐색기 크기 설정

Powershell에서 Custom Set-Window 스크립트를 사용하여 창에서 탐색기 크기 설정

이 답변에 제공된 스크립트를 사용하려고 합니다. PowerShell 5 및 6에서 창 크기 및 위치 설정

여러 창 탐색기 창의 높이와 크기를 설정합니다. 인터넷 익스플로러가 아니라.. '익스플로러'라는 파일 브라우저.

'메모장' 프로그램과 함께 작동합니다. 하지만 '탐색기' 프로그램에서는 그렇지 않습니다.

#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을 사용하여 이 작업을 어떻게 수행할 수 있습니까?

편집: 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를 사용하고 항목(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

네이티브 Windows API를 사용하면 가능합니다. 이 같은:

[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 자동화 도구가 아닙니다. 당신이 지적한대로, 그냥 사용하면 어떨까요?

Ui자동화

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

프로젝트 설명

UIAutomation 모듈은 GUI 테스트 작업 시 소프트웨어 테스트 자동화를 단순화합니다. 3.0 이후 .Net Framework의 일부인 UI 자동화 라이브러리를 기반으로 하는 이 모듈은 소프트웨어 엔지니어의 삶을 최대한 쉽게 만들어줍니다.

말벌

WASP는 창 및 컨트롤 선택, 마우스 및 키보드 이벤트 전송과 같은 Windows 자동화 작업을 위한 PowerShell 스냅인입니다. Select-Window, Select-Control, Send-Keys, Send-Click, Get-WindowPosition, Set-WindowPosition, Set-WindowActive, Remove-Window와 같은 cmdlet이 있습니다.

참고: 이는 더 이상 유지 관리되지 않지만 설계된 대로 계속 작동하며 유지 관리된 적이 없거나 앞으로도 유지되지 않을 샘플 코드를 사용하고 있다는 사실입니다.

완전히 유지 관리되는 다음 솔루션도 참조하세요.

오토IT

이제 최신 버전의 AutoIt 스크립팅 언어가 PowerShell 사용자를 위한 보너스와 함께 제공됩니다. 기본 PowerShell Cmdlet 세트! 이를 통해 AutoIt의 고유한 기능(창 조작 및 키 입력 시뮬레이션)을 일반적인 PowerShell 스크립트에 추가할 수 있습니다. 추가 보너스로 AutoIt PowerShell Cmdlet 및 어셈블리는 디지털 서명되어 있어 보다 엄격한 실행 정책과 함께 사용할 수 있습니다. Cmdlet은 x86 및 x64 버전의 PowerShell에서도 기본적으로 실행됩니다!

관련 정보