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}"
}
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ą? –
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
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} ' –