2015-08-09 5 views
6

मैं पावरहेल के लिए नया हूँ। मैं अपना खुद का कस्टम प्रॉम्प्ट बनाने की कोशिश कर रहा हूं जो वर्तमान डीआईआर का एक संक्षिप्त संस्करण दिखाता है जब तक कि आप इसे CTRL + R दबाकर विस्तारित न करें। इसके अलावा, मैं यह करने के लिए करना चाहते हैं:पावरहेल कुंजी प्रेस पर त्वरित परिवर्तन कैसे करें?

$short\dir\path...> 
*user presses CTRL+R* 
$really\really\long\full\dir\path> 
*Full dir path is shown as long as CTLR + R is held down* 

उत्तर

0

मुझे नहीं लगता कि ऐसा करने के लिए एक रास्ता है, लेकिन मैं आप के साथ मैं बजाय का उपयोग करना चाहते एक कस्टम शीघ्र साझा कर सकते हैं:

function prompt { 
    $Host.UI.RawUI.WindowTitle = Get-Location 
    "[$env:COMPUTERNAME] PS> " 
} 

यह वर्तमान कंप्यूटर नाम को प्रॉम्प्ट में रखता है (आपको इसके लिए कोई आवश्यकता नहीं हो सकती है), लेकिन वर्तमान पथ को विंडो शीर्षक में रखता है, जहां लंबे पथ विशेष रूप से रास्ते से बाहर होते हैं और प्रॉम्प्ट को अव्यवस्थित नहीं करते हैं।

0

निम्नलिखित ऐसा करने का एक तरीका है, लेकिन इसमें बहुत से समझौता शामिल हैं। सबसे पहले यह केवल पीएस कंसोल में काम करते समय आईएसई नहीं, या पीएस होस्ट करने वाले किसी भी एप्लीकेशन में नहीं। दूसरा, यह कितना काम करेगा, इस पर निर्भर करता है कि, ummm, "चिकनी" आप अनुभव चाहते हैं। तीसरा, यह शायद अन्य अप्रत्याशित सामान होने का कारण बन जाएगा।

मूल रूप से आप उस त्वरित फ़ंक्शन के लिए एक स्क्रिप्ट लिखते हैं जो कुंजीपटल को Ctrl-R या किसी अन्य "क्रिया" वर्ण के लिए देखता है। "एक्शन" कैरेक्टर से मेरा मतलब है एंटर, टैब, बैकस्पेस, अप-एरो, डाउन-एरो इत्यादि जैसे कुछ ऐसा होता है जो कुछ घटित होता है। यदि स्क्रिप्ट Ctrl-R को देखती है तो आप टाइटल बार में या कंसोल में पूर्ण पथ आउटपुट कर सकते हैं। यदि आप इसे कंसोल पर आउटपुट करते हैं, तो आपकी स्क्रिप्ट को यह पता लगाना होगा कि कंसोल की कौन सी पंक्ति में वर्तमान प्रॉम्प्ट है। राउई सदस्य में यह जानकारी है।

एक नंगे रूपरेखा लग सकता है जैसे:

do { 
    sleep -milli 250 
    if ($host.ui.rawui.keyavailable) { 
     $key = $host.ui.rawui.readkey() 
     if ($key.character -eq [char]'x') { 
     write-host burp 
     } else { break} 
    } 
    } while ($true) 

हर तिमाही दूसरे पटकथा देखता है, तो एक चाबी उपलब्ध है। यदि ऐसा है तो यह कुंजी पढ़ता है। यदि कुंजी 'x' है (आपके लिए ctrl-r) तो यह "burp" आउटपुट करता है। लेकिन आप संदेश को सही जगह पर रखने के लिए तर्क के साथ 'burp' को पूर्ण पथ में बदल देंगे (शीर्षक पट्टी या कंसोल पर दायां पंक्ति)।

यदि कुंजी 'x' नहीं है तो यह सरल उदाहरण बस लौटाता है। इसका मतलब है कि 'x' को "खाया जाता है" और 'x' कार्यक्षमता तब तक काम नहीं करती जब तक कि अगला संकेत आउटपुट न हो। हालांकि आप बदले में सभी "एक्शन" कुंजियों को अपने आप संभालने के बजाय स्वयं को संभाल सकते हैं। यदि ऊपर-तीर दबाया जाता है तो आप पिछले कमांड को पुनर्प्राप्त करेंगे और इसे कंसोल पर आउटपुट करेंगे। यदि बैकरो दबाया जाता है तो आप कर्सर से पहले चरित्र को हटा देंगे। यदि टैब दबाया जाता है तो आपको पीएस के अंतर्निर्मित कमांड पूर्ण होने के साथ बातचीत करना होगा (सुनिश्चित नहीं है कि यह संभव है)। आदि

आखिरकार जब उपयोगकर्ता रिटर्न दबाता है, तो आपको कंसोल पर कमांड लाइन बनाने वाली सभी कुंजियों को खिलाना होगा (आप WScript होस्ट की SendKeys विधि का उपयोग कर सकते हैं), या आप निष्पादित कर सकते हैं Invoke-Expression (iex) का उपयोग करके सीधे आपसे तुरंत कार्य करें। यदि आप आईईएक्स कमांड इतिहास का उपयोग करते हैं जो पीएस रखता है (यानी इतिहास प्राप्त करें) काम नहीं करेगा, जब तक कि आप इसे संभालने का कोई तरीका न समझें (शायद ऐड-हिस्ट्री?)। यदि आप SendKeys का उपयोग करते हैं तो एक मौका है कि कोई व्यक्ति तेजी से टाइप करने से अपने मुख्य स्ट्रोक को SendKeys से अलग कर देगा।

समझौता के रूप में, सभी "एक्शन" कुंजियों को स्वयं संभालने के बजाय, आप केवल प्रॉम्प्ट से बाहर निकल सकते हैं जब ctrl-r के अलावा एक कुंजी दबाया जाता है और charK को रोकने के लिए कंसोल में एक कुंजी भेजने के लिए SendKeys का उपयोग करता है "खाया" पाने से। इस तरह आप शायद कुछ सौ के बजाय स्क्रिप्ट की 20 लाइनों के साथ प्राप्त कर सकते हैं, ctrl-r की कीमत पर केवल किसी भी अक्षर टाइप किए जाने से पहले काम कर सकते हैं।

एक और जटिलता। readkey() आपको नीचे और ऊपर कीस्ट्रोक दोनों प्राप्त करने की अनुमति देता है। तो जब तक ctrl-r में 'r' दबाया जाता है तब तक आप पूर्ण पथ प्रदर्शित कर सकते हैं।हालांकि आपकी स्क्रिप्ट को कहीं और कीस्ट्रोक को ऊपर/नीचे समझने की आवश्यकता होगी। यह नीचे कीस्ट्रोक को अनदेखा करने के समान सरल हो सकता है।

इसके लिए एक उज्ज्वल पक्ष है। आप पीएस सामान्य रूप से क्या करता है इसके ऊपर और ऊपर कुंजी-हैंडलिंग कार्यक्षमता लागू कर सकते हैं। तो अगर आप वर्तमान समय को दिखाने के लिए ctrl-t चाहते थे, तो आप ऐसा कर सकते थे। यदि आप कर्सर के नीचे वर्तमान शब्द को हटाने के लिए ctrl-w चाहते थे तो आप कर सकते थे।

0

यह एक सुपर सुरुचिपूर्ण समाधान नहीं है, लेकिन यह मूल निर्देशिका को प्रदर्शित करने के लिए मूल रूप से Ctrl + Alt + R को हॉटकी में बदल देता है। आप तार को "Ctrl + R" में बदल सकते हैं लेकिन आप पावरहेल के लिए एक डिफ़ॉल्ट PSReadlineKeyHandler ओवरराइट कर देंगे। ऐसा लगता है कि यह कमांड पर फंस जाता है, लेकिन यदि आप टाइप करना शुरू करते हैं तो अगली पंक्ति दिखाई देगी। आप $env:USERPROFILE\Documents\WindowsPowershell\

function prompt { 
    if(($pwd | split-path -Parent | Split-Path -Leaf) -match ':') 
    { 
     "$pwd\>" 
    } 
    elseif (($pwd | Split-Path -Leaf) -match ':') 
    { 
     "$pwd>" 
    } 
    else { 
     "...\$($pwd | split-path -Parent | Split-Path -Leaf)\$($pwd | Split-path -Leaf)\>" 
    } 
} 

Set-PSReadlineKeyHandler -Chord "Ctrl+Alt+R" -ScriptBlock { 
    write-host $pwd -nonewLine 
} 

उम्मीद है कि मदद करता है कि अपनी Microsoft.Powershell_Profile.ps1 स्थित करने के लिए इन दोनों को जोड़ने की आवश्यकता होगी!

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