2012-12-03 25 views
8

Để làm cho nó rõ ràng hơn khi tôi được truy cập từ xa đến một máy chủ trực tiếp/sản xuất, tôi nghĩ sẽ thuận tiện khi có thể tô màu tên máy mà tôi kết nối khi sử dụng các phiên PowerShell từ xa.Làm cách nào để thêm màu vào tên máy trong lời nhắc của phiên Từ xa PowerShell?

Tuy nhiên, tôi không thể thấy cách thực hiện điều này ... Tiền tố tên máy chủ có vẻ độc lập với hàm Prompt và thậm chí nếu tôi có thể sử dụng, tôi không chắc chắn cách tôi có thể xác định lời nhắc mới chỉ trong khoảng thời gian của phiên.

Có cách nào để tùy chỉnh điều này không? Lưu ý: Tôi không muốn tô màu tất cả các tên máy chủ giống nhau, tôi muốn phân biệt giữa các máy chủ cục bộ/sản xuất.

Trả lời

5

Sau khi một số tìm kiếm xung quanh có vẻ như bạn đã chính xác rằng không có móc gắn sẵn để ghi đè thẻ trước [computername]: trước.

May mắn thay, tôi có cách giải quyết có thể hữu ích cho bạn!

Để lấy màu, chúng tôi chỉ có thể sử dụng Write-Host. Write-Host đầu ra từ các chức năng prompt sẽ được hoàn toàn trái hợp lý, đó là những gì chúng tôi muốn. Rất tiếc, thẻ [computername]: mặc định được chèn trực tiếp sau đó. Điều đó dẫn đến tên máy tính bị trùng lặp trong dấu nhắc, một lần với màu sắc và một lần không có.

Chúng tôi giải quyết vấn đề này bằng cách trả về một chuỗi có chứa các ký tự backspace, do đó, màu [computername]: không được ghi đè sẽ bị ghi đè. Đây là chuỗi dấu nhắc bình thường, thường là đường dẫn hiện tại.

Cuối cùng, trong trường hợp chuỗi dấu nhắc bình thường ngắn và không ghi đè hoàn toàn thẻ [computername]: không màu, chúng tôi cần thực hiện một số lần dọn dẹp cuối cùng bằng cách thêm các ký tự khoảng trắng giả. Tuy nhiên, điều đó có thể đẩy ra dấu mũ, vì vậy chúng tôi cần thêm nhiều khoảng trống hơn để trả lại dấu nháy vào vị trí cố định.

All-up, sử dụng này trên máy tính từ xa của bạn:

# 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

vấn đề nhẹ với điều này; nếu máy tính ở xa và có tên như mycomputer.mydomain.com thì có vẻ như nó lộn xộn; có lẽ vì $ env: ComputerName chỉ là phần địa phương? –

+0

Có, '$ env: ComputerName' chỉ là tên máy chủ. Tôi tin rằng thẻ Powershell cho biết thêm khớp với chuỗi bạn chuyển đến 'Enter-PsSession -ComputerName'. Tức là, nếu bạn chỉ cung cấp tên máy chủ, nó sẽ chỉ hiển thị tên máy chủ, ngay cả đối với một hộp tên miền đã tham gia. Nếu bạn chọn hoàn toàn đủ điều kiện, Powershell sẽ in tên đầy đủ. Tất cả mã nhắc nhở này đang chạy trên hộp điều khiển từ xa, không có bất kỳ cách nào để biết bạn có thể chọn tùy chọn nào. – latkin

+0

Tìm thấy một cách để sửa lỗi này; chức năng kết nối trợ giúp của tôi chỉ có thể vượt qua máy chủ được sử dụng để kết nối vào phiên làm việc từ xa, sau đó có thể được sử dụng bởi hàm nhắc (nếu được định nghĩa) 'Invoke-Command -Session $ session -ScriptBlock {$ connectedHost = $ using: remoteHost} ' –

Các vấn đề liên quan