Скрипт Bash для открытия нескольких окон git-bash в определенных размерах и местах?

#windows #bash #git #git-bash

#Windows #bash #git #git-bash

Вопрос:

Возможно ли написать скрипт bash, который открывает шесть окон git, открытых в сетке 2×3, с каждым окном размером 400x400px. См. Рис. Возможно ли это? Я использую Windows 10. Предположим, что мой дисплей — это мой 2-й дисплей с разрешением 1600 x 1200 с книжной ориентацией.

Что-то вроде этого, но с размерами и местоположениями x, y и умножением на шесть:

alias bash='/git-bash.exe amp; > /dev/null 2amp;>1'

введите описание изображения здесь

Комментарии:

1. Вы были бы довольны powershell скриптом, который делает это? Powershell работает намного лучше в среде Windows, чем bash.

2. @Lenna Конечно. В конечном счете было бы неплохо иметь его в качестве быстрого запуска на моей панели задач, но я, вероятно, мог бы сохранить его как .bat правильное?

3. @Lenna Например, у меня есть файл с именем empty.bat , который принудительно очищает мою корзину. PowerShell.exe -NoProfile -Command Clear-RecycleBin -Confirm:$false

Ответ №1:

Я бы использовал скрипт 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

        .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
        $Handle = (Get-Process -Name $ProcessName).MainWindowHandle
        $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            
            }
        }
    }
}
amp; "$env:ProgramFilesGitbingit-bash.exe"
get-process git-bash | foreach { 
  Set-Window -ProcessName $_ -X 400 -Y 4000
}
  

Функция Set-Window из
https://gallery.technet.microsoft.com/scriptcenter/Set-the-position-and-size-54853527

Комментарии:

1. Что мне нужно добавить, чтобы сохранить его в виде .bat файла, чтобы я мог запустить его двойным щелчком мыши?

2. Сохраните его как файл .ps1, а затем дважды щелкните

3. Дважды щелкните по нему, как .ps1 открывает его в Блокноте. Это не имеет большого значения. Мне все равно нужно настроить скрипт, потому что его запуск в PowerShell открывает только один экземпляр git-bash.