Определить, какой шрифт используется сеансом PowerShell - PullRequest
2 голосов
/ 18 июня 2020

Мне нужен способ определить, какой шрифт в настоящее время используется PowerShell, чтобы я мог выдавать определенные символы (глифы) из этого шрифта, если он активен. Однако, если шрифт неактивен, мне нужно знать, чтобы я мог избежать испускания этих глифов из модуля.

Вопрос : Есть ли способ определить, какой шрифт в настоящее время используется в сеансе PowerShell, работает в iTerm2 (Ma c), VSCode или Windows Terminal, например?

Я проверил встроенную переменную $Host, чтобы узнать, есть ли в ней ничего подобного, но здесь нет никаких свойств, связанных со шрифтом, кроме цвета переднего плана.

ForegroundColor       : Gray
BackgroundColor       : Black
CursorPosition        : 0,43
WindowPosition        : 0,0
CursorSize            : 25
BufferSize            : 164,44
WindowSize            : 164,44
MaxWindowSize         : 164,44
MaxPhysicalWindowSize : 3824,132
KeyAvailable          : True
WindowTitle           : PowerShell

Ответы [ 2 ]

0 голосов
/ 20 июня 2020

Следующий скрипт может помочь.

if ( -not ('Win32test.ConsoleTest' -as [type]) ) {
$defConsoleTest = @'
using System.Runtime.InteropServices;
using System;

namespace Win32test
{
    public static class ConsoleTest
    {
        [DllImport( "kernel32.dll", 
                    CharSet = CharSet.Unicode, SetLastError = true)]
        extern static bool GetCurrentConsoleFontEx(
            IntPtr hConsoleOutput,
            bool bMaximumWindow,
            ref CONSOLE_FONT_INFOEX lpConsoleCurrentFont);

        private enum StdHandle
        {
            OutputHandle = -11  // The standard output device.
        }

        [DllImport("kernel32")]
        private static extern IntPtr GetStdHandle(StdHandle index);

        public static string GetFontCsvHeader(){
            return  "FaceName,FontFamily,FontWeight,FontSize";
        }

        public static string GetFontCsv()
        {
            // Instantiating CONSOLE_FONT_INFOEX and setting cbsize
            CONSOLE_FONT_INFOEX ConsoleFontInfo = new CONSOLE_FONT_INFOEX();
            ConsoleFontInfo.cbSize = (uint)Marshal.SizeOf(ConsoleFontInfo);

            GetCurrentConsoleFontEx( GetStdHandle(StdHandle.OutputHandle),
                                     false, 
                                     ref ConsoleFontInfo);

            return  ConsoleFontInfo.FaceName + 
              "," + ConsoleFontInfo.FontFamily + 
              "," + ConsoleFontInfo.FontWeight + 
              "," + ConsoleFontInfo.dwFontSize.X + 
                    "×" + ConsoleFontInfo.dwFontSize.Y;
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct COORD
        {
            public short X;
            public short Y;

            public COORD(short x, short y)
            {
            X = x;
            Y = y;
            }
        }

        // docs.microsoft.com/en-us/windows/console/console-font-infoex
        [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
        private struct CONSOLE_FONT_INFOEX
        {
            public uint  cbSize;
            public uint  nFont;
            public COORD dwFontSize;
            public int   FontFamily;
            public int   FontWeight;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            public string FaceName;
        }
    }
}
'@
Add-Type -TypeDefinition $defConsoleTest
}

# convert output to a pscustomobject
[Win32test.ConsoleTest]::GetFontCsvHeader(), 
[Win32test.ConsoleTest]::GetFontCsv() |
    ConvertFrom-Csv -Delimiter ','

Вывод протестирован в Windows 10 , как Powershell 5.1, так и Pw Sh 7.0.1 (консоль, а также терминал VSCode):

D:\PShell\tests\GetCurrentConsoleFontEx.ps1
FaceName    FontFamily FontWeight FontSize
--------    ---------- ---------- --------
Courier New 54         400        11×20

Тот же вывод из Windows cmd.

powershell -nopro -comm "& {D:\PShell\tests\GetCurrentConsoleFontEx.ps1}"
pwsh -nopro -comm "& {D:\PShell\tests\GetCurrentConsoleFontEx.ps1}"
0 голосов
/ 19 июня 2020

Значения реестра для font style находятся в

HKCU\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe

или

HKCU\Console\%SystemRoot%_SysWOW64_WindowsPowerShell_v1.0_powershell.exe

частях реестра 1 . Вы можете получить их в PowerShell с помощью

(Get-ItemProperty -Path "HKCU:\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe").facename
#or
(Get-ItemProperty -Path "HKCU:\Console\%SystemRoot%_SysWOW64_WindowsPowerShell_v1.0_powershell.exe").facename

Как и в случае с apple iTerm, я не знаю, будет ли реестр PSDrive, но он может ...

Вы можете изменить шрифт с

Set-ItemProperty -Path "HKCU:\Console\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe" -Name "facename" -Value "Font Name" -Type String
#or
Set-ItemProperty -Path "HKCU:\Console\%SystemRoot%_SysWOW64_WindowsPowerShell_v1.0_powershell.exe" -Name "facename" -Value "Font Name" -Type String

Существует также клавиша FontFamily, но я понятия не имею, как она работает, так как это клавиша REG_DWORD и в ней указаны c числа для c семейства шрифтов ...



1 в зависимости от того, используете ли вы \System32\WindowsPowerShell\v1.0\powershell.exe или \SysWOW64\WindowsPowerShell\v1.0\powershell.exe [32-разрядный или 64-разрядный] Powershell

2 Я бы посоветовал посмотреть https://superuser.com/questions/502340/how-can-i-install-a-new-font-in-powershell-console также

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...