Cuma Eğlencesi: Beni Büyüt


Günlük işin bir kısmı, genellikle Pluralsight için video eğitimi veya Petri.com için makaleler şeklinde eğitim materyali oluşturmayı içerir. Genellikle PowerShell'i ele aldığım için sıklıkla bir PowerShell oturumu yakalamam gerekiyor. Bazen ekranın belirli bir boyutta olmasını istiyorum. Bu yüzden zamanla konsol ve uygulama pencerelerini yeniden boyutlandırmak için birkaç PowerShell aracı oluşturdum. PowerShell konsol penceresi, boyutunu $Host.ui.rawui.windowsize altında saklar.

Bunlar burada göreceğiniz ayarların aynısıdır:

Arabellek boyutlarından daha küçük bir değer kullandığınız sürece konsol penceresini bir komut isteminden değiştirebilirsiniz. Ancak fark edemeyeceğiniz bir adım atıyor. Bunu yapamazsınız:

$host.ui.rawui.WindowSize.Height = 40

Bunun yerine, istediğiniz boyutlara sahip yeni bir nesne türü oluşturabilirsiniz.

$size = New-Object System.Management.Automation.Host.Size(100,25)

Daha sonra bu nesneyi WindowSize özelliği için bir değer olarak kullanabilirsiniz.

$host.ui.rawui.WindowSize = $size

Doğal olarak bunu benim için yapacak bir fonksiyon yarattım.

#requires -version 3.0

#not for the ISE

Function Set-ConsoleWindowSize {
[cmdletbinding(SupportsShouldProcess)]

Param(
[Alias("x")]
[ValidateScript({$_ -ge 10 -AND $_ -le $host.ui.rawui.buffersize.width})]
[int]$Width = $host.ui.rawui.windowsize.width,

[Alias("y")]
[ValidateScript({$_ -ge 10 -AND $_ -le $host.ui.rawui.buffersize.height})]
[int]$Height = $host.ui.rawui.windowsize.height
)

    write-verbose "Setting dimensions to $width x $height"  
    $size = New-Object System.Management.Automation.Host.Size($Width,$Height)
    
    #WhatIf code
    if ($PSCmdlet.ShouldProcess("$width by $height")) {
        $host.ui.rawui.WindowSize = $size
    }
}

Benim işlevim aynı zamanda -WhatIf'i destekleyecek kodu da içeriyor.

Tabii artık size bir alternatifim olduğunu gösterdiğime göre. Genişlik ve yükseklik özelliklerine sahip .NET sınıfını [System.Console] kullanabilirsiniz. Ve bu değerleri bağımsız olarak ayarlayabilirsiniz.

[system.console]::WindowHeight = 20

.NET Framework hakkında bir şeyler bilmiyorsanız bunu keşfedemezsiniz, ancak $host'u keşfetmiş olabilirsiniz, bu yüzden size ilk önce bunu gösterdim. Sık sık 1280×720 boyutlarında video kaydetmem gerektiğinden, PowerShell konsol penceremi bu boyutlara ayarlamak için hızlı ve kirli bir komut dosyası yazdım.

#requires -version 3.0

#set PowerShell console to 1280x720
#This is NOT for the ISE

[cmdletbinding(SupportsShouldProcess)]
Param()

$h = 33
$w = 103

Write-Verbose "Setting Height to $h"
Write-Verbose "Setting Width to $w"

if ($PSCmdlet.shouldProcess("current session")) {
    [system.console]::WindowHeight = $h
    [system.console]::WindowWidth = $w
}

Şu ana kadar size gösterdiğim her şey PowerShell konsolu içindir. Peki ya İMKB? Bahsettiğim teknikleri kullanamazsınız. Uygulama pencereleri biraz daha karmaşıktır ve ayrıntılara girmeyeceğim. Ancak GitHub'da bazı kodlarla karşılaştım (https://Gist.github.com/coldnebo/1148334). Minecraft yapmıyorum ama onu yeniden kullanılabilir bir işleve dönüştürmek çok fazla zamanımı almadı.

#requires -version 3.0

#from https://gist.github.com/coldnebo/1148334

Function Set-WindowSize {

[cmdletbinding(SupportsShouldProcess)]
Param(
[Parameter(Position=0,HelpMessage="What is the MainWindowHandle?",
ValueFromPipeline,ValueFromPipelineByPropertyName)]
[ValidateNotNullorEmpty()]
[Alias("handle")]
[System.IntPtr]$MainWindowHandle = (Get-Process -id $pid).MainWindowHandle,
[Alias("x")]
[int]$Width = 1280,
[Alias("y")]
[int]$Height = 720

)

Begin {
    Write-Verbose "Starting $($MyInvocation.Mycommand)" 
    
    Write-Verbose "Adding type"

Add-Type @"
  using System;
  using System.Runtime.InteropServices;
 
  public class Win32 {
    [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 static extern bool GetClientRect(IntPtr hWnd, out RECT lpRect);
 
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    public static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);
  }
 
  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
  }
 
"@
  
} #begin

Process {

#verify handle and get process

Write-Verbose "Verifying process with MainWindowHandle of $MainWindowhandle"

$proc = (Get-Process).where({$_.mainwindowhandle -eq $MainWindowhandle})

if (-NOT $proc.mainwindowhandle) {
    Write-Warning "Failed to find a process with a MainWindowHandle of $MainWndowhandle"
    #bail out
    Return
}

Write-Verbose "Creating rectangle objects" 
$rcWindow = New-Object RECT
$rcClient = New-Object RECT

Write-Verbose "Getting current settings"
[Win32]::GetWindowRect($MainWindowHandle,[ref]$rcWindow) | Out-Null
[Win32]::GetClientRect($MainWindowHandle,[ref]$rcClient) | Out-Null
 
Write-Verbose "Setting new coordinates"

#WhatIf
if ($PSCmdlet.ShouldProcess("$($proc.MainWindowTitle) to $width by $height")) {
    $dx = ($rcWindow.Right - $rcWindow.Left) - $rcClient.Right
    $dy = ($rcWindow.Bottom - $rcWindow.Top) - $rcClient.Bottom

    Write-Verbose "Moving window" 
    [Win32]::MoveWindow($MainWindowHandle, $rct.Left, $rct.Top, $width + $dx, $height + $dy, $true ) | out-null
} #close Whatif


} #process

End {
    Write-Verbose "Ending $($MyInvocation.Mycommand)"
} #end

} #end Set-WindowSize function

Kod -WhatIf'i destekler ve varsayılan olarak muhtemelen PowerShell ISE olan geçerli uygulamayı kullanır.

Ama aslında ayarlanan şey budur.

Dolayısıyla başlık çubuğunu eklemek istiyorsanız buna göre ayarlama yapmanız gerekir.

Bunların hepsi işinize pek uygun olmayabilir ancak iyi bir kullanım alanı bulursanız bana haber vereceğinizi umuyorum. Harika bir hafta sonu geçirin.

İlgili makaleler