Page 1 of 1

How to define screen buffer size for "Mode 120,60" command?

Posted: 27 Apr 2022 23:20
by tobwz
When I put the command

mode 120,60

at the top of an batch script then the output command prompt window will have a width of 120 chars and a height 60 rows.
It works.

However sometimes the output of the script is longer than 60 lines.
Therefore I need a way to define a screen buffer size (with scrollbar).

In "normal" Command prompt windows I can go to menu

Properties--->Layout--->Screen Buffer Size--->Height =9000

This works.

When I do the same within a Commandprompt window WITH ""MODE" command this does NOT work.
I can defined a screen buffer size. But the next time I run the script this screen buffer size is reset to 60 (=same as number of visual rows).

So how can I define (in mode command) an additional buffer size?
Or make buffer size from menu permanent?

Re: How to define screen buffer size for "Mode 120,60" command?

Posted: 28 Apr 2022 05:30
by Aacini
I don't remember the exact procedure to make buffer size from menu permanent, but I think was this:
  1. Run your mode command
  2. Run wmic with no parameters. A wmic prompt is open, for example:

    Code: Select all

    wmic:root\cli>
    
  3. At this point, go to menu (right click on cmd window) and complete your Properties--->Layout--->Screen Buffer Size--->Height =9000
  4. Enter "exit" to close wmic.
Please, report the result...

Antonio

Re: How to define screen buffer size for "Mode 120,60" command?

Posted: 28 Apr 2022 06:15
by atfon
If you are open to powershell, I've done this from a batch script:

Code: Select all

powershell.exe -noprofile -command "&{$w=(get-host).ui.rawui;$w.buffersize=@{width=120;height=9001};$w.windowsize=@{width=120;height=60};}"

Re: How to define screen buffer size for "Mode 120,60" command?

Posted: 28 Apr 2022 22:31
by tobwz
Aacini wrote:
28 Apr 2022 05:30
I don't remember the exact procedure to make buffer size from menu permanent, but I think was this:
  1. Run your mode command
  2. Run wmic with no parameters. A wmic prompt is open, for example:

    Code: Select all

    wmic:root\cli>
    
  3. At this point, go to menu (right click on cmd window) and complete your Properties--->Layout--->Screen Buffer Size--->Height =9000
  4. Enter "exit" to close wmic.
Ok, this works for the CommandPrompt when I open just the Commandprompt.
Therefore it is not necessary to open wmic

But if I exit CommandPrompt and double click afterwards on a *.bat batch script with a "mode 120,60" statement at the top
then previously set buffersize is NOT recognized/setup.
buffersize is windowsize

So this is not a solution

Re: How to define screen buffer size for "Mode 120,60" command?

Posted: 28 Apr 2022 22:36
by tobwz
atfon wrote:
28 Apr 2022 06:15
If you are open to powershell, I've done this from a batch script:

Code: Select all

powershell.exe -noprofile -command "&{$w=(get-host).ui.rawui;$w.buffersize=@{width=120;height=500};$w.windowsize=@{width=120;height=60};}"

When I replace the "mode 120,60" command at the top of a batch script by your powershell command it works - partially.
A red error notification is shown:
Exception setting "buffersize": "Cannot set the buffer size because the size specified is too large or too small.
Parameter name: value
Actual value was 120,500."
At line:1 char:26
+ ... {$w=(get-host).ui.rawui;$w.buffersize=@{width=120;height=500};$w.wind ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], SetValueInvocationException
+ FullyQualifiedErrorId : ExceptionWhenSetting
Though the buffer seems to be setup anyway.

But the ugly red error text is misleading and should vanish.
How can I get rid of it?

Re: How to define screen buffer size for "Mode 120,60" command?

Posted: 29 Apr 2022 02:43
by penpen
You should test, whether or not the error text really is misleading. Since the buffer is set first, it might be smaller than the actual window size at that point:

Code: Select all

powershell.exe -noprofile -command "&{Write-Host "initial WindowSize $(get-host).UI.RawUI.WindowSize"; $w=(get-host).ui.rawui;$w.buffersize=@{width=120;height=500};$w.windowsize=@{width=120;height=60};}"

penpen

Re: How to define screen buffer size for "Mode 120,60" command?

Posted: 29 Apr 2022 11:23
by aGerman
I think penpen is right. You should rather apply kinda clamped math here. That means, determine the maximum window size first, compare with your settings, and take care you don't exceed the maximum values.
Something about like that:

Code: Select all

@echo off &setlocal

:::::::::::::::::::
setlocal DisableDelayedExpansion
set set_clamped_console_window_size=for %%- in (1 2) do if %%-==2 (^
%=% setlocal EnableDelayedExpansion^&for /f "tokens=1,2" %%. in ("^^!p^^!") do^
%===% endlocal^&powershell.exe -nop -ep Bypass -c ^"$c=Add-Type -Name pInv -PassThru -MemberDefinition '^
%=====% [DllImport(\"shcore.dll\")] public static extern void SetProcessDpiAwareness(int val);^
%=====% [DllImport(\"user32.dll\")] public static extern void SetProcessDPIAware();^
%=====% [DllImport(\"user32.dll\")] public static extern int GetSystemMetrics(int idx);^
%=====% [DllImport(\"kernel32.dll\")] public static extern IntPtr CreateFile(string name,int acc,int share,IntPtr sec,int how,int flags,IntPtr tmplt);^
%=====% [DllImport(\"kernel32.dll\")] public static extern void GetCurrentConsoleFont(IntPtr hOut,int maxWnd,short[] info);^
%=====% [DllImport(\"kernel32.dll\")] public static extern void CloseHandle(IntPtr handle);';^
%===% try{$c::SetProcessDpiAwareness(2)}catch{$c::SetProcessDPIAware()}^
%===% $hOut=$c::CreateFile('CONOUT$',-1073741824,2,[IntPtr]::Zero,3,0,[IntPtr]::Zero);^
%===% [Int16[]]$fInf=0,0,0,0;$c::GetCurrentConsoleFont($hOut,0,$fInf);$c::CloseHandle($hOut);^
%===% [int]$xmin=$c::GetSystemMetrics(28)/$fInf[2]+1;^
%===% $w=$host.UI.RawUI;$xmax=$w.MaxPhysicalWindowSize.Width;$ymax=$w.MaxPhysicalWindowSize.Height;^
%===% $x=[Math]::Min($xmax,[Math]::Max($xmin,%%~.));$y=[Math]::Min($ymax,[Math]::Max(1,%%~/));^
%===% try{$w.BufferSize=New-Object Management.Automation.Host.Size($x,9001)}catch{}^
%===% $w.WindowSize=New-Object Management.Automation.Host.Size($x,$y);^
%===% $w.BufferSize=New-Object Management.Automation.Host.Size($x,9001);^"^
%=% ^&endlocal) else setlocal DisableDelayedExpansion^&set p=
endlocal&set "set_clamped_console_window_size=%set_clamped_console_window_size%"
if !!# neq # set "set_clamped_console_window_size=%set_clamped_console_window_size:^^!=!%"
:::::::::::::::::::

%set_clamped_console_window_size% 20 1000
pause
%set_clamped_console_window_size% 1000 20
pause
%set_clamped_console_window_size% -1000 -1000
pause
%set_clamped_console_window_size% 1000 1000
pause
This code is also backward compatible to PowerShell 2 btw.

Steffen

Re: How to define screen buffer size for "Mode 120,60" command?

Posted: 29 Apr 2022 13:11
by tobwz
penpen wrote:
29 Apr 2022 02:43
You should test, whether or not the error text really is misleading. Since the buffer is set first, it might be smaller than the actual window size at that point:

Code: Select all

powershell.exe -noprofile -command "&{Write-Host "initial WindowSize $(get-host).UI.RawUI.WindowSize"; $w=(get-host).ui.rawui;$w.buffersize=@{width=120;height=500};$w.windowsize=@{width=120;height=60};}"
@penpen:

This code looks good.

@aGerman.

I will check your advanced code

Re: How to define screen buffer size for "Mode 120,60" command?

Posted: 30 Apr 2022 05:02
by penpen
I only added a debug output, so you can see whether or not the error message is misleading.
I didn't change the program logic.