2012-12-03 11 views
8

जब मुझे लाइव/प्रोडक्शन सर्वर पर रिमोट किया जाता है, तो इसे और अधिक स्पष्ट करने के लिए, मैंने सोचा कि यह दूरस्थ पावरशेल सत्रों का उपयोग करते समय मशीन नाम को रंग देने में सक्षम होगा।PowerShell Remoting सत्र के संकेत में मैं मशीन नाम में रंग कैसे जोड़ सकता हूं?

हालांकि, मुझे ऐसा करने का कोई तरीका नहीं दिख रहा है ... सर्वर का नाम उपसर्ग प्रॉम्प्ट फ़ंक्शन से स्वतंत्र प्रतीत होता है, और यहां तक ​​कि अगर मैं इसका उपयोग कर सकता हूं, तो मुझे यकीन नहीं है कि मैं कैसे परिभाषित कर सकता हूं केवल सत्र की अवधि के लिए नया संकेत।

क्या इसे अनुकूलित करने का कोई तरीका है? नोट: मैं सभी सर्वर नामों को रंगना नहीं चाहता हूं, मुझे स्थानीय/उत्पादन सर्वर के बीच भेद चाहिए।

उत्तर

5

इसके आसपास कुछ खोज करने के बाद ऐसा लगता है कि आप सही हैं कि प्री-प्रॉम्प्ट [computername]: टैग को ओवरराइड करने के लिए अंतर्निर्मित हुक नहीं है।

सौभाग्य से, मेरे पास एक हैकी कामकाज है जो आपके लिए काम कर सकता है!

रंग प्राप्त करने के लिए, हम केवल 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}" 
} 
+0

इस के साथ थोड़ा सा समस्या; अगर कंप्यूटर रिमोट है और mycomputer.mydomain.com जैसा नाम है तो यह गड़बड़ लग रहा है; संभवतः क्योंकि $ env: ComputerName केवल स्थानीय हिस्सा है? –

+0

हां, '$ env: ComputerName' सिर्फ होस्टनाम है। मेरा मानना ​​है कि टैग पावरहेल उस स्ट्रिंग से मेल खाता है जिसे आप 'एंटर-PsSession -ComputerName' पर पास करते हैं। यही है, अगर आप केवल होस्टनाम देते हैं, तो यह केवल डोमेन-जुड़े बॉक्स के लिए होस्टनाम दिखाएगा। यदि आपने इसे पूरी तरह अर्हता प्राप्त करने का विकल्प चुना है, तो पावरहेल पूरी तरह से योग्य नाम मुद्रित करेगा। यह सभी प्रॉम्प्ट कोड रिमोट बॉक्स पर चल रहा है, जिसमें यह जानने का कोई तरीका नहीं है कि आपने कौन सा विकल्प चुना होगा। – latkin

+0

इसे ठीक करने के लिए एक niec रास्ता मिला; मेरा सहायक कनेक्शन फ़ंक्शन केवल दूरस्थ सत्र में कनेक्ट करने के लिए उपयोग किए गए होस्ट को पास कर सकता है, जिसका उपयोग तत्काल फ़ंक्शन (यदि परिभाषित किया गया हो) द्वारा किया जा सकता है 'Invoke-Command-session $ session -ScriptBlock {$ linkedHost = $ का उपयोग कर: remoteHost} ' –

संबंधित मुद्दे