2012-12-03 6 views
8

Aby było to bardziej oczywiste po ponownym połączeniu z serwerem na żywo/produkcyjnym, pomyślałem, że przydałaby się możliwość nadania nazwy urządzeniu, z którym jestem połączony, podczas używania zdalnych sesji PowerShell.Jak mogę dodać kolor do nazwy komputera w podpowiedzi sesji PowerShell Remoting?

Jednak nie widzę sposobu, aby to zrobić ... Przedrostek nazwy serwera wydaje się być niezależny od funkcji Pytaj, a nawet jeśli mógłbym go użyć, nie jestem pewien, w jaki sposób mogę zdefiniować new Pytaj tylko na czas trwania sesji.

Czy istnieje sposób dostosowania tego? Uwaga: Nie chcę kolorować wszystkich nazw serwerów tak samo, chciałbym rozróżnić serwery lokalne/produkcyjne.

Odpowiedz

5

Po pewnym przeszukiwaniu wydaje się, że masz rację, że nie ma wbudowanego haka, który zastąpiłby etykietę pre-prompt [computername]:.

Na szczęście mam hacky obejście, które może pracować dla ciebie!

Aby uzyskać kolor, możemy po prostu użyć Write-Host. Write-Host wyjście z funkcji prompt zostanie w pełni wyjustowane w lewo, co jest tym, czego chcemy. Niestety domyślny tag [computername]: jest wstawiany bezpośrednio po tym. Powoduje to, że nazwa komputera jest powielana w monicie, raz w kolorze i raz bez.

Przejdziemy przez to, zwracając ciąg znaków zawierający znaki Backspace, dzięki czemu nienaruszony [computername]: zostanie nadpisany. Jest to normalny ciąg znaków, zwykle aktualna ścieżka.

Na koniec, w przypadku, gdy zwykły tekst zachęty jest krótki i nie w pełni zastępuje znacznik [computername]:, musimy wykonać końcowe czyszczenie, dodając puste znaki. Może to jednak przesunie nas do przodu, więc musimy dodać więcej odstępów, aby przywrócić karetkę do właściwej pozycji.

All-up, to wykorzystać na zdalnym komputerze:

# 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}" 
} 
+0

niewielki problem z tym; jeśli komputer jest zdalny i ma nazwę taką jak mycomputer.mydomain.com, wydaje się, że to zepsuje; prawdopodobnie dlatego, że $ env: ComputerName jest tylko lokalną częścią? –

+0

Tak, '$ env: NazwaKomputera' jest po prostu nazwą hosta. Wydaje mi się, że tag Powershell dodaje dopasowania do ciągu, który przekazujesz do 'Enter-PsSession -NazwaKomputera'. Oznacza to, że jeśli podasz tylko nazwę hosta, wyświetli ona tylko nazwę hosta, nawet dla skrzynki połączonej z domeną. Jeśli zdecydujesz się na pełną kwalifikację, Powershell wydrukuje pełną nazwę. Cały ten kod zachęty działa na zdalnym polu, które nie ma żadnego sposobu na sprawdzenie, która opcja została wybrana. – latkin

+0

Znalazłem niecny sposób, aby to naprawić; moja funkcja połączenia pomocniczego może po prostu przekazać host służący do łączenia się ze zdalną sesją, która może być następnie użyta przez funkcję prompt (jeśli została zdefiniowana) 'Invoke-Command -Session $ session -ScriptBlock {$ connectedHost = $ using: remoteHost} ' –

Powiązane problemy