По умолчанию Get-Process
командлет возвращает System.Diagnostics.Process
объект или массив таких объектов, если есть больше совпадающих процессов. К сожалению, оригинальный Set-Window.ps1
сценарий не отражает последний сценарий.
Вывод с использованием улучшенного скрипта:
PS D:\PShell> Get-Process -ProcessName notepad Handles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName ------- ------ ----- ----- ------ -- -- ----------- 505 29 12104 41232 2,05 4208 1 notepad 231 14 3068 13212 0,09 6732 1 notepad PS D:\PShell> . D:\PShell\Downloaded\WindowManipulation\Set-Window.ps1 PS D:\PShell> Set-Window -ProcessName notepad -X 11 -Y 11 -Width 1200 -Height 900 -Passthru ProcessName Size TopLeft BottomRight ----------- ---- ------- ----------- notepad 1200,900 11,11 1211,911 notepad 1200,900 11,11 1211,911 PS D:\PShell>
Улучшенный скрипт (изменения прокомментированы):
Function Set-Window { <# .SYNOPSIS Sets the window size (height,width) and coordinates (x,y) of a process window. .DESCRIPTION Sets the window size (height,width) and coordinates (x,y) of a process window. .PARAMETER ProcessName Name of the process to determine the window characteristics .PARAMETER X Set the position of the window in pixels from the top. .PARAMETER Y Set the position of the window in pixels from the left. .PARAMETER Width Set the width of the window. .PARAMETER Height Set the height of the window. .PARAMETER Passthru Display the output object of the window. .NOTES Name: Set-Window Author: Boe Prox Version History 1.0//Boe Prox - 11/24/2015 - Initial build 1.1//JosefZ (https://superuser.com/users/376602/josefz) - 19.05.2018 - treats more process instances of supplied process name properly .OUTPUT System.Automation.WindowInfo .EXAMPLE Get-Process powershell | Set-Window -X 2040 -Y 142 -Passthru ProcessName Size TopLeft BottomRight ----------- ---- ------- ----------- powershell 1262,642 2040,142 3302,784 Description ----------- Set the coordinates on the window for the process PowerShell.exe #> [OutputType('System.Automation.WindowInfo')] [cmdletbinding()] Param ( [parameter(ValueFromPipelineByPropertyName=$True)] $ProcessName, [int]$X, [int]$Y, [int]$Width, [int]$Height, [switch]$Passthru ) Begin { Try{ [void][Window] } Catch { Add-Type @" using System; using System.Runtime.InteropServices; public class Window { [DllImport("user32.dll")] [return: MarshalAs(UnmanagedType.Bool)] public static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); [DllImport("User32.dll")] public extern static bool MoveWindow(IntPtr handle, int x, int y, int width, int height, bool redraw); } public struct RECT { public int Left; // x position of upper-left corner public int Top; // y position of upper-left corner public int Right; // x position of lower-right corner public int Bottom; // y position of lower-right corner } "@ } } Process { $Rectangle = New-Object RECT $Handles = (Get-Process -Name $ProcessName).MainWindowHandle ### 1.1//JosefZ foreach ( $Handle in $Handles ) { ### 1.1//JosefZ if ( $Handle -eq [System.IntPtr]::Zero ) { Continue } ### 1.1//JosefZ $Return = [Window]::GetWindowRect($Handle,[ref]$Rectangle) If (-NOT $PSBoundParameters.ContainsKey('Width')) { $Width = $Rectangle.Right - $Rectangle.Left } If (-NOT $PSBoundParameters.ContainsKey('Height')) { $Height = $Rectangle.Bottom - $Rectangle.Top } If ($Return) { $Return = [Window]::MoveWindow($Handle, $x, $y, $Width, $Height,$True) } If ($PSBoundParameters.ContainsKey('Passthru')) { $Rectangle = New-Object RECT $Return = [Window]::GetWindowRect($Handle,[ref]$Rectangle) If ($Return) { $Height = $Rectangle.Bottom - $Rectangle.Top $Width = $Rectangle.Right - $Rectangle.Left $Size = New-Object System.Management.Automation.Host.Size -ArgumentList $Width, $Height $TopLeft = New-Object System.Management.Automation.Host.Coordinates -ArgumentList $Rectangle.Left, $Rectangle.Top $BottomRight = New-Object System.Management.Automation.Host.Coordinates -ArgumentList $Rectangle.Right, $Rectangle.Bottom If ($Rectangle.Top -lt 0 -AND $Rectangle.LEft -lt 0) { Write-Warning "Window is minimized! Coordinates will not be accurate." } $Object = [pscustomobject]@{ ProcessName = $ProcessName Size = $Size TopLeft = $TopLeft BottomRight = $BottomRight } $Object.PSTypeNames.insert(0,'System.Automation.WindowInfo') $Object } } } } }