如何在PowerShell远程处理会话的提示中为计算机名称添加颜色?

时间:2012-12-03 18:56:00

标签: powershell powershell-remoting powershell-v3.0

为了让我更加明显,当我远程连接到一个实时/生产服务器时,我认为在使用远程PowerShell会话时能够为我连接的机器名称着色是很方便的。

但是,我看不到这样做的方法......服务器名称前缀似乎独立于提示功能,即使我可以使用它,我也不确定如何定义新的仅在会话期间提示。

有没有办法自定义这个?注意:我不想为所有服务器名称着色相同,我想区分本地/生产服务器。

2 个答案:

答案 0 :(得分:5)

经过一些搜索后,似乎你没有内置的钩子来覆盖预提示[computername]:标签。

幸运的是,我有一个适合你的hacky解决方法!

要获得颜色,我们可以使用Write-Host。来自Write-Host函数的prompt输出将完全左对齐,这正是我们想要的。不幸的是,之后会直接插入默认的[computername]:标记。这导致计算机名称在提示中重复,一次使用颜色,一次不使用。

我们通过返回包含退格字符的字符串来解决这个问题,因此将覆盖未着色的[computername]:。这是正常的提示字符串,通常是当前路径。

最后,如果正常的提示字符串很短并且没有完全覆盖未着色的[computername]:标记,我们需要通过添加虚拟空格字符来进行最后的清理。但是,这可能会推出插入符号,因此我们需要添加更多退格键以将插入符号返回到正确的位置。

全部,在远程机器上使用它:

# put your logic here for getting prompt color by machine name
function GetMachineColor($computerName)
{
   [ConsoleColor]::Green
}

function GetComputerName
{
  # if you want FQDN
  $ipProperties = [System.Net.NetworkInformation.IPGlobalProperties]::GetIPGlobalProperties()
  "{0}.{1}" -f $ipProperties.HostName, $ipProperties.DomainName

  # if you want host name only
  # $env:computername
}

function prompt
{
  $cn = GetComputerName

  # write computer name with color
  Write-Host "[${cn}]: " -Fore (GetMachineColor $cn) -NoNew

  # generate regular prompt you would be showing
  $defaultPrompt = "PS $($executionContext.SessionState.Path.CurrentLocation)$('>' * ($nestedPromptLevel + 1)) "

  # generate backspaces to cover [computername]: pre-prompt printed by powershell
  $backspaces = "`b" * ($cn.Length + 4)

  # compute how much extra, if any, needs to be cleaned up at the end
  $remainingChars = [Math]::Max(($cn.Length + 4) - $defaultPrompt.Length, 0)
  $tail = (" " * $remainingChars) + ("`b" * $remainingChars)

  "${backspaces}${defaultPrompt}${tail}"
}

答案 1 :(得分:0)

我使用Posh-Git完成此操作。参见他们的Prompt Customization。我注意到有些文档有些过时,如果您仅在PowerShell中键入$GitPromptSettings,您将看到所有可用的属性。使用Posh-Git可以在提示符下查看Git统计信息。

我用来设置机器名称的命令是...

$GitPromptSettings.DefaultPromptPrefix = '$(get-content env:computername) '

这里是颜色设置

$ GitPromptSettings.DefaultPromptPath.ForegroundColor ='橙色'