2015-08-09 15 views
6

Tôi là người mới đến Powershell. Tôi đang cố gắng để tạo ra dấu nhắc tùy chỉnh của riêng tôi cho thấy một phiên bản cắt ngắn của dir hiện tại, trừ khi bạn mở rộng nó bằng cách nhấn CTRL + R. Hơn nữa, tôi muốn làm điều này:Powershell làm cách nào để thực hiện thay đổi nhắc trên nhấn phím?

$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* 

Trả lời

0

Tôi không nghĩ rằng có một cách để làm điều đó, nhưng tôi có thể chia sẻ với bạn một dấu nhắc tùy chỉnh Tôi thích sử dụng thay vì:

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

Điều này đặt tên máy tính hiện tại trong dấu nhắc (bạn có thể không cần thiết cho điều này), nhưng đặt đường dẫn hiện tại trong tiêu đề cửa sổ, nơi đường dẫn dài đặc biệt là ra khỏi con đường và không lộn xộn dấu nhắc.

0

Sau đây là cách để làm điều này, nhưng nó liên quan đến rất nhiều sự thỏa hiệp. Đầu tiên nó chỉ trong khi làm việc trong giao diện điều khiển PS, không phải là ISE, hoặc không phải trong bất kỳ ứng dụng nào lưu trữ PS. Thứ hai nó sẽ liên quan đến rất nhiều công việc, tùy thuộc vào cách, ummm, "mịn" mà bạn muốn trải nghiệm. Thứ ba, nó có thể sẽ gây ra những điều bất ngờ khác xảy ra.

Về cơ bản, bạn viết một tập lệnh cho chức năng nhắc kiểm tra bàn phím tìm kiếm cho Ctrl-R hoặc bất kỳ ký tự "hành động" nào khác. Bởi ký tự "hành động" tôi có nghĩa là một cái gì đó như nhập, tab, backspace, mũi tên lên, xuống mũi tên, vv mà gây ra một cái gì đó để xảy ra. Nếu kịch bản thấy Ctrl-R thì bạn có thể xuất ra đường dẫn đầy đủ, hoặc trong thanh tiêu đề, hoặc đến bàn điều khiển. Nếu bạn xuất nó vào giao diện điều khiển, sau đó kịch bản của bạn sẽ phải tìm ra hàng của giao diện điều khiển chứa lời nhắc hiện tại. Thành viên Rawui chứa thông tin này.

Một phác thảo trần có thể trông giống như:

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) 

Định kỳ hàng quý thứ hai kịch bản thấy nếu một chìa khóa có sẵn. Nếu vậy nó đọc chìa khóa. Nếu khóa là 'x' (ctrl-r cho bạn), nó xuất ra "ợ". Nhưng bạn sẽ thay đổi 'ợ' thành đường dẫn đầy đủ, cùng với logic để đặt thông điệp vào đúng vị trí (thanh tiêu đề hoặc hàng bên phải trên bảng điều khiển).

Nếu khóa không phải là 'x' thì ví dụ đơn giản này chỉ trả lại. Điều đó có nghĩa là 'x' bị "ăn" và chức năng 'x' không còn hoạt động cho đến khi dấu nhắc tiếp theo là đầu ra. Tuy nhiên, thay vào đó bạn có thể tự mình xử lý tất cả các phím "hành động" thay vì trả lại. Nếu nhấn mũi tên lên, bạn sẽ lấy lệnh trước đó và xuất nó ra bàn điều khiển. Nếu backarrow được nhấn, bạn sẽ xóa ký tự trước con trỏ. Nếu nhấn tab, bạn phải tương tác với lệnh hoàn thành lệnh của PS (không chắc chắn nếu có thể). Cuối cùng, khi người dùng nhấn quay trở lại, bạn cần phải cấp tất cả các khóa tạo nên dòng lệnh cho bảng điều khiển (bạn có thể sử dụng phương thức SendKeys của máy chủ WScript), hoặc bạn có thể thực thi lệnh trực tiếp từ hàm nhắc bạn, sử dụng Invoke-Expression (iex). Nếu bạn sử dụng iex lịch sử lệnh mà PS giữ (tức là get-history) sẽ không hoạt động, trừ khi bạn tìm ra cách để xử lý (có thể Add-History?). Nếu bạn sử dụng SendKeys, có khả năng ai đó gõ nhanh sẽ nhận được các nét chính của anh ấy xen kẽ với SendKeys. Là một sự thỏa hiệp, thay vì tự xử lý tất cả các phím "hành động", bạn chỉ có thể thoát khỏi dấu nhắc khi một phím bên cạnh ctrl-r được nhấn và sử dụng SendKeys để gửi một phím đó đến bàn điều khiển, để ngăn chặn char từ việc "ăn". Bằng cách đó bạn có thể có thể nhận được bởi với 20 dòng kịch bản thay vì một vài trăm, tại các chi phí của ctrl-r chỉ làm việc trước khi bất kỳ ký tự được gõ.

Một biến chứng khác. readkey() cho phép bạn nhận được cả hai phím bấm lên và lên. Vì vậy, bạn có thể hiển thị đường dẫn đầy đủ miễn là 'r' trong ctrl-r được nhấn.Tuy nhiên, tập lệnh của bạn sẽ cần phải hiểu/tắt các tổ hợp phím ở nơi khác. Điều đó có thể đơn giản như chỉ bỏ qua các phím tắt.

Có một mặt sáng sủa cho điều này. Bạn có thể thực hiện chức năng xử lý khóa hơn và cao hơn những gì PS thường làm. Vì vậy, nếu bạn muốn ctrl-t hiển thị thời gian hiện tại, bạn có thể làm điều đó. Nếu bạn muốn ctrl-w xóa từ hiện tại bên dưới con trỏ bạn có thể.

0

Đây không phải là giải pháp siêu thanh lịch, nhưng về cơ bản biến Ctrl + Alt + R thành phím nóng để hiển thị thư mục hiện tại. Bạn có thể thay đổi hợp âm thành "Ctrl + R" nhưng bạn sẽ ghi đè PSReadlineKeyHandler mặc định cho PowerShell. Có vẻ như nó bị kẹt trên lệnh, nhưng nếu bạn bắt đầu gõ dòng tiếp theo sẽ xuất hiện. Bạn sẽ cần phải thêm cả hai để Microsoft.Powershell_Profile.ps1 của bạn nằm ở $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 
} 

Hy vọng rằng sẽ giúp!

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