Personalizando a fonte e o tamanho da fonte do PowerShell

10

Temos vários sistemas principais de servidores do Windows 2012 com configuração do PowerShell como shell padrão usando os seguintes comandos:

$RegPath = "Microsoft.PowerShell.Core\Registry::HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\winlogon"
Set-ItemProperty -Confirm  -Path $RegPath -Name Shell -Value 'cmd.exe /C start /max PowerShell.exe -noExit'

Eu descobri que podemos personalizar a cor da fonte do PowerShell com um script especial do PowerShell em c: \ Windows \ System32 \ WindowsPowerShell \ v1.0 \ profile.ps1. Este script é usado por todos os usuários.

No entanto, agora eu quero personalizar a face e o tamanho da fonte (novamente para todos os usuários) que são persistentes. IE Se eu sair do servidor e entrar novamente, desejo que as configurações sejam mantidas. Da mesma forma, se eu entrar como administrador, ou se o meu PowerShell da minha conta parecer idêntico - use a mesma cor de fonte, face e tamanho da fonte.

Com o Powershell ISE, parece possível definir a face e o tamanho da fonte usando:

$psISE.Options.FontName = 'Lucida Sans Console' 
$psISE.Options.FontSize = 14

Qual é o equivalente para o próprio PowerShell?

Brad
fonte

Respostas:

4

O PowerShell (não o ISE) aproveita o "Console Host", que é uma atualização um pouco mais moderna do prompt de comando do MS-DOS antigo . O Host do console era a maneira da Microsoft de manter o prompt de comando compatível com as versões modernas do Windows, mas também compatível com os aplicativos de console antigos.

Quando você inicia o Powershell.exe, o csrss.exe gera um processo filho chamado conhost.exe. Esse comportamento é idêntico ao quando você inicia o Cmd.exe.

Mas desde que eles tinham para manter a compatibilidade com velhos aplicações de console, eles não podiam mudar o olhar e sentir muito muito, nem eles poderiam ir mudando e quebrando um monte de interfaces internas.

Não vou dizer que é impossível, mas é mais difícil do que se poderia pensar.

Não há nada (Get-Host).UI.RawUI. Não há nada na System.Consoleclasse .NET.

Você pode alterar a face e o tamanho da fonte no registro, fazendo algo assim:

(editar: sublinhados não barras)

Set-Location HKCU:\Console
New-Item '.\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe'
Set-Location '.\%SystemRoot%_System32_WindowsPowerShell_v1.0_powershell.exe'

New-ItemProperty . FaceName -type STRING -value "Lucida Console"
New-ItemProperty . FontFamily -type DWORD -value 0x00000036
New-ItemProperty . FontSize -type DWORD -value 0x000c0000
New-ItemProperty . FontWeight -type DWORD -value 0x00000190

Há também várias exportações no kernel32.dll que alteram a fonte:

typedef struct _CONSOLE_FONT {

   DWORD index;

   COORD dim;

} CONSOLE_FONT; 

BOOL WINAPI SetConsoleFont(HANDLE hOutput, DWORD fontIndex);
BOOL WINAPI GetConsoleFontInfo(HANDLE hOutput, BOOL bMaximize, DWORD numFonts, CONSOLE_FONT* info);
DWORD WINAPI GetNumberOfConsoleFonts();
BOOL WINAPI SetConsoleIcon(HICON hIcon);
Ryan Ries
fonte
Tentei usar o código acima para alterar a fonte através do registro (mas não parece ter feito nada). É necessário algo para que a configuração entre em vigor?
Brad
Parece que as chaves de registro corretas (pelo menos para o Windows Server 2012) são um pouco diferentes Set-Location '. \% SystemRoot% _System32_WindowsPowerShell_v1.0_powershell.exe' e Set-Location '. \% SystemRoot% _SysWOW64_WindowsPowerShell_v1.0_powershell.exe' e Parece que o código está em execução, mas minha fonte não altera o console do PowerShell.
Brad
Usando este módulo: gallery.technet.microsoft.com/scriptcenter/… Consegui alterar as fontes, mas parece que as opções são muito limitadas. Na verdade, as fontes disponíveis para mim acabavam distorcidas, grandes ou pequenas demais. Estou tentando descobrir como posso selecionar diferentes tamanhos de fonte.
Brad
1
Sim, a pessoa que escreveu isso está provocando essas exportações do kernel32.dll de que eu estava falando. E sim, as opções são bastante limitadas. É por isso que, quando você altera a fonte de qualquer aplicativo de console por meio da GUI, você tem apenas três opções de fonte. Você não pode ter o Comic Sans em seu aplicativo de console, incluindo o Powershell. No script desse cara, ele está definindo a fonte Set-ConsoleFont 28. Cada número de fonte tem uma altura e largura predeterminadas. Assim como quando você o altera na GUI.
Ryan Ries
Parece que algo tão simples como alterar a face e o tamanho da fonte (que seria de se supor que seria uma mudança rudimentar) é quase impossível (ou pelo menos extremamente difícil / com opções muito limitadas). Acho que estamos presos a um tamanho de fonte que me fará ficar cego de estrabismo - obrigado Microsoft.
Brad