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 = $sizeDoğ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 functionKod -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.







