открыть окно powershell в позиции экрана - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь открыть новое окно powershell, что я могу сделать хорошо.Однако я не могу установить его положение на экране.

Я использую следующее: https://superuser.com/questions/1324007/setting-window-size-and-position-in-powershell-5-and-6

, но получаю следующую ошибку: Ошибка вызова метода, поскольку [Window] не содержитметод с именем MoveWindow.

Вот скрипт powershell:

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")]
            [return: MarshalAs(UnmanagedType.Bool)]
            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            
            }
        }
    }
}

}

Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 14 марта 2019

Не могли бы вы использовать VBScript?

Посмотрите на этот ответ https://superuser.com/a/325611

Замените cmd.exe на powershell.exe и вызовите скрипт, используя cscript.exe script.vbs

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...