Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在PowerShell远程处理会话的提示中为计算机名称添加颜色?_Powershell_Powershell Remoting_Powershell 3.0 - Fatal编程技术网

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

如何在PowerShell远程处理会话的提示中为计算机名称添加颜色?,powershell,powershell-remoting,powershell-3.0,Powershell,Powershell Remoting,Powershell 3.0,为了让我在远程连接到实时/生产服务器时更加明显,我认为在使用远程PowerShell会话时,能够为连接到的机器名称上色会很方便 然而,我找不到一个方法来做到这一点。。。服务器名称前缀似乎独立于提示符函数,即使我可以使用它,我也不确定如何仅在会话期间定义新的提示符 有没有办法定制这个?注意:我不希望所有服务器名称的颜色都相同,我希望在本地/生产服务器之间进行区分。经过一番搜索后,您似乎认为没有内置钩子覆盖预提示[computername]:标记是正确的 幸运的是,我有一个黑客的解决办法,可以为你工

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

然而,我找不到一个方法来做到这一点。。。服务器名称前缀似乎独立于提示符函数,即使我可以使用它,我也不确定如何仅在会话期间定义新的提示符


有没有办法定制这个?注意:我不希望所有服务器名称的颜色都相同,我希望在本地/生产服务器之间进行区分。

经过一番搜索后,您似乎认为没有内置钩子覆盖预提示
[computername]:
标记是正确的

幸运的是,我有一个黑客的解决办法,可以为你工作

要获得颜色,我们只需使用
Write Host
<代码>写入主机从
提示符
函数输出的内容将完全左对齐,这正是我们想要的。不幸的是,默认的
[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}"
}
我过去常常这样做。看看他们的。我注意到有些文档有点过时,如果您在PowerShell中键入
$GitPromptSettings
,您将看到所有可用的属性。使用Posh Git还可以在提示符上看到Git统计信息

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

$GitPromptSettings.defaultpromptpprefix='$(获取内容环境:computername)

这是颜色设置


$GitPromptSettings.DefaultPromptPath.ForegroundColor='Orange'

此项有轻微问题;如果计算机是远程的,并且有一个像mycomputer.mydomain.com这样的名称,那么它似乎会出错;大概是因为$env:ComputerName只是本地部分?是的,
$env:ComputerName
只是主机名。我相信Powershell添加的标记与传递给
Enter PsSession-ComputerName
的字符串相匹配。也就是说,如果您只提供主机名,它将只显示主机名,即使对于已加入域的框也是如此。如果选择完全限定名称,Powershell将打印完全限定名称。所有这些提示代码都在远程框上运行,远程框无法知道您可能选择了哪个选项;my helper连接函数只需将用于连接到远程会话的主机传递给提示函数(如果已定义)
Invoke命令-session$session-ScriptBlock{$connectedHost=$using:remoteHost}