param([Parameter(Mandatory=$true)][string]$OutFile) $lines = New-Object System.Collections.Generic.List[string] function L($s) { $lines.Add($s) } function MK([int[]]$cp) { -join ($cp | ForEach-Object { [char]$_ }) } $raw = $Host.UI.RawUI $cases = @( ,@('8 ASCII ', 'A1b2C3d4') ,@('2 CJK ', (MK @(0x4E2D, 0x6587))) ,@('4 CJK ', (MK @(0x4E2D, 0x6587, 0x5907, 0x4EFD))) ,@('3 boxdraw ', (MK @(0x250C, 0x2500, 0x2510))) ,@('1 emoji ', [char]::ConvertFromUtf32(0x1F600)) ,@('2 fullwidth', (MK @(0xFF21, 0xFF22))) ,@('2 halfkata ', (MK @(0xFF71, 0xFF72))) ,@('CJK+colon ', (MK @(0x4E2D, 0x6587, 0xFF1A, 0x0020)) + 'X') ,@('punctuation', (MK @(0x3002, 0x3001, 0xFF0C))) ,@('hangul ', (MK @(0xD55C, 0xAE00))) ,@('kana ', (MK @(0x3042, 0x3044))) ,@('cyrillic ', (MK @(0x0416, 0x0418))) ,@('accented ', (MK @(0x00E9, 0x00E8))) ,@('tabs+ctrl ', "a`tb") ) L ("PSVersion: " + $PSVersionTable.PSVersion + " PSEdition: " + $PSVersionTable.PSEdition) L ("IsOutputRedirected: " + [Console]::IsOutputRedirected) L "" L "### `$Host.UI.RawUI.LengthInBufferCells() -- BUILT-IN cell-width API ###" L (" method present? " + [bool]($raw | Get-Member -Name LengthInBufferCells -MemberType Method)) $mi = $raw | Get-Member -Name LengthInBufferCells -MemberType Method if ($mi) { foreach ($d in $mi) { L (" overload: " + $d.Definition) } } L "" L " {0,-12} {1,8} {2,14} {3,10}" -f 'case', '.Length', 'LengthInBuffer', 'expected~' foreach ($c in $cases) { $nm = $c[0]; $s = [string]$c[1] $w = 'n/a' try { $w = $raw.LengthInBufferCells($s) } catch { $w = 'THREW: ' + $_.Exception.Message } L (" {0,-12} {1,8} {2,14} {3,10}" -f $nm, $s.Length, $w, '') } L "" L "### per-character version: LengthInBufferCells(char, offset) ###" foreach ($c in $cases) { $nm = $c[0]; $s = [string]$c[1] $sum = 0; $eb = '' foreach ($ch in $s.ToCharArray()) { try { $u = $raw.LengthInBufferCells($ch); $eb += $u } catch { $eb += '?'; $sum = -999 } } L (" {0,-12} sum(char overload)={1} perchar={2}" -f $nm, $sum, $eb) } L "" L "### Other RawUI helpers that exist in BOTH hosts ###" L (" NewBufferCellArray overloads: " + (((($raw | Get-Member -Name NewBufferCellArray -MemberType Method).Definition) -join ' | '))) L (" SetBufferContents overloads : " + (((($raw | Get-Member -Name SetBufferContents -MemberType Method).Definition) -join ' | '))) L (" GetBufferContents overloads : " + (((($raw | Get-Member -Name GetBufferContents -MemberType Method).Definition) -join ' | '))) L (" ScrollBufferContents overloads: " + (((($raw | Get-Member -Name ScrollBufferContents -MemberType Method).Definition) -join ' | '))) L (" ReadKey overloads : " + (((($raw | Get-Member -Name ReadKey -MemberType Method).Definition) -join ' | '))) L (" FlushInputBuffer overloads : " + (((($raw | Get-Member -Name FlushInputBuffer -MemberType Method).Definition) -join ' | '))) [System.IO.File]::WriteAllLines($OutFile, $lines, (New-Object System.Text.UTF8Encoding($false)))