Mengatur ukuran explorer di windows menggunakan Custom Set-Window Script di Powershell

1

Saya mencoba menggunakan skrip yang diberikan dalam jawaban ini. Mengatur ukuran dan posisi jendela di PowerShell 5 dan 6

untuk mengatur tinggi dan ukuran beberapa jendela windows explorer. Bukan internet explroer .. browser file yang disebut 'explorer'.

ini bekerja dengan program 'notepad'. tetapi tidak dengan program '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

idealnya saya ingin memiliki skrip:

  1. buka 3 windows explorer.
  2. arahkan ke filepath A, B, C
  3. mengubah ukuran setiap jendela ke lokasi tertentu di layar

Bagaimana saya bisa melakukan ini tanpa menginstal perangkat lunak tambahan dan hanya menggunakan PowerShell mentah di sini?

EDIT: Setelah menggunakan saran harrymc, saya sudah setengah jalan melalui masalah .. Saya bisa memindahkan jendela tapi saya hanya perlu mencari cara untuk menangani 3 proses anak penjelajah ...

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

Edit 2:

Saya sudah mencoba mendapatkan jendela penjelajah melalui fungsi Mulai-Proses tetapi saya menerima kesalahan:

$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

katanya sudah keluar ... tapi jendela penjelajah filebrowser tetap terbuka ... tidak yakin apa yang terjadi di sini. Jika saya mencobanya dengan notepad berfungsi ...

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

Sunting 3: Saya sudah menemukannya menggunakan ComObject, dan mengakses 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")                                                   
Ryu S.
sumber

Jawaban:

0

Seharusnya dimungkinkan dengan menggunakan API Windows asli. Sesuatu seperti ini:

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

Karena kode umum ini tidak berfungsi untuk Explorer, berikut adalah solusi alternatif (diuji):

$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
harrymc
sumber
Bagaimana saya mendapatkan processId untuk proses explorer anak? Cara saya memahaminya, jika saya membuka ctrl + alt + del task manager, saya melihat satu proses explorer berjalan (yang merupakan proses yang menunjukkan seluruh GUI pada windows cukup banyak kan?) Saya hanya ingin memilih salah satu dari yang kecil windows explorer terletak di taskbar saya.
Ryu S.
ok saya tahu bagaimana cara mendapatkan id dari proses explorer tetapi mendapatkan pegangannya adalah menyebabkan kesalahan ... memperbarui pertanyaan dengan contoh output
Ryu S.
Explorer tampaknya menjadi pengecualian di sini, jadi saya menambahkan alternatif yang berfungsi.
harrymc
hmm Saya mendapatkan kesalahan ketika mencoba mengatur bagian atas, lebar dll ... lihat pertanyaan yang diperbarui
Ryu S.
Saya sudah menemukan jawabannya, saya harus menambahkan langkah tambahan di mana saya mengakses objek menggunakan item (0)
Ryu S.
0

PowerShell sebenarnya bukan alat otomatisasi UI. Sesuai apa yang Anda tunjukkan, mengapa tidak menggunakan ...

UiAtomation

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

Deskripsi Proyek

Modul UIAutomation menyederhanakan otomatisasi pengujian perangkat lunak saat Anda mengerjakan tes GUI. Berdasarkan perpustakaan Automation UI yang merupakan bagian dari .Net Framework sejak 3.0, modul ini dimaksudkan untuk membuat kehidupan para insinyur perangkat lunak semudah mungkin.

TAWON

WASP adalah snapin PowerShell untuk tugas-tugas Windows Automation seperti memilih jendela dan kontrol dan mengirim peristiwa mouse dan keyboard. Kami memiliki cmdlet seperti Select-Window, Select-Control, Send-Keys, Send-Click, Get-WindowPosition, Set-WindowPosition, Set-WindowActive, Remove-Window

Catatan: Ini tidak lagi dipertahankan, tetapi masih berfungsi seperti yang dirancang dan fakta Anda menggunakan kode sampel yang tidak pernah atau akan pernah dipertahankan.

Lihat juga solusi terawat penuh ini:

AutoIT

Versi terbaru dari bahasa skrip AutoIt sekarang datang dengan bonus untuk pengguna PowerShell. Satu set Cmdlet PowerShell asli! Ini memungkinkan Anda untuk menambahkan fitur unik AutoIt - manipulasi jendela dan simulasi keystroke - ke skrip PowerShell Anda yang biasa. Sebagai bonus tambahan, Cmdlet dan Sidang AutoIt PowerShell ditandatangani secara digital sehingga dapat digunakan dengan kebijakan eksekusi yang lebih ketat. Cmdlet juga akan berjalan secara native dengan PowerShell versi x86 dan x64!

postanote
sumber
Karena persyaratan operasional, sistem yang saya gunakan adalah mesin vanilla biasa tanpa kemampuan untuk menginstal perangkat lunak khusus dari internet
Ryu S.