2015-08-09 5 views
6

Sono nuovo di Powershell. Sto cercando di creare il mio prompt personalizzato che mostra una versione troncata della directory corrente a meno che non la si espanda premendo CTRL + R. Inoltre, mi piacerebbe fare questo:Powershell come modificare il prompt sulla pressione dei tasti?

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

risposta

0

Non credo ci sia un modo per farlo, ma posso condividere con voi un prompt personalizzato Mi piace usare invece:

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

Inserisce il nome del computer corrente nel prompt (potrebbe non essere necessario per questo), ma inserisce il percorso corrente nel titolo della finestra, dove i percorsi lunghi sono particolarmente fuori strada e non ingombrano il prompt.

0

Quello che segue è un modo per farlo, ma comporta molti compromessi. Innanzitutto solo mentre si lavora nella console PS, non in ISE, o in nessuna applicazione che ospita PS. Secondo, richiederà molto lavoro, a seconda di come, ummm, "liscio" vuoi che sia l'esperienza. Terzo, probabilmente causerà altre cose inaspettate.

Fondamentalmente si scrive uno script per la funzione prompt che esegue il polling della tastiera cercando Ctrl-R o qualsiasi altro carattere di "azione". Per carattere "azione" intendo qualcosa come enter, tab, backspace, up-arrow, down-arrow, ecc. Che fa sì che qualcosa accada. Se lo script vede Ctrl-R, puoi pubblicare il percorso completo, nella barra del titolo o nella console. Se lo si invia alla console, lo script dovrà capire quale riga della console contiene il prompt corrente. Il membro Rawui contiene queste informazioni.

Un contorno nudo potrebbe essere simile:

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) 

Ogni quarto di secondo il copione vede se un tasto è disponibile. Se è così legge la chiave. Se la chiave è 'x' (ctrl-r per te) emette "rutto". Ma cambierebbe 'rutto' per il percorso completo, insieme alla logica per mettere il messaggio nel posto giusto (barra del titolo o riga destra sulla console).

Se la chiave non è "x", questo semplice esempio restituisce semplicemente. Ciò significa che la "x" diventa "mangiata" e la funzionalità "x" non funziona più finché non viene visualizzato il prompt successivo. Tuttavia potresti invece gestire tutte le chiavi "azione" da solo invece di tornare. Se si preme la freccia su, si recupera il comando precedente e lo si invia alla console. Se viene premuto backarrow, si elimina il carattere prima del cursore. Se la scheda viene premuta, dovrai interagire con il completamento del comando integrato di PS (non è sicuro se ciò è possibile). Etc.

Alla fine, quando l'utente preme Invio, è necessario alimentare tutti i tasti che compongono la riga di comando nella console (è possibile utilizzare il metodo SendKeys dell'host WScript) oppure è possibile eseguire il comando direttamente dalla funzione prompt, usando Invoke-Expression (iex). Se usi iex, la cronologia dei comandi che PS conserva (cioè get-history) non funzionerà, a meno che non trovi un modo per gestirli (forse Add-History?). Se usi SendKeys, c'è la possibilità che qualcuno digiti velocemente ottenga i suoi tratti chiave intervallati da SendKeys.

Come compromesso, invece di gestire tutti i tasti "azione" da soli, è possibile uscire dalla richiesta quando viene premuto un tasto oltre a ctrl-r e utilizzare SendKeys per inviare quell'unica chiave alla console, per impedire il char da ottenere "mangiato". In questo modo potresti probabilmente cavartela con 20 righe di script anziché poche centinaia, a spese di ctrl-r solo lavorando prima che i caratteri vengano digitati.

Un'altra complicazione. readkey() ti consente di ottenere sia la pressione verso il basso che verso l'alto. In questo modo è possibile visualizzare il percorso completo fintanto che viene premuto il tasto 'r' in ctrl-r.Comunque lo script dovrebbe capire le sequenze di tasti su/giù altrove. Potrebbe essere semplice come semplicemente ignorare i tasti premuti.

C'è un lato positivo in questo. Si potrebbe implementare la funzionalità di gestione delle chiavi oltre a ciò che normalmente fa PS. Quindi, se vuoi che ctrl-t mostri l'ora corrente, puoi farlo. Se si desidera che ctrl-w cancelli la parola corrente sotto il cursore, si potrebbe.

0

Questa non è una soluzione super elegante, ma in pratica trasforma Ctrl + Alt + R in un tasto di scelta rapida per visualizzare la directory corrente. Puoi cambiare l'accordo in "Ctrl + R" ma sovrascrivi un PSReadlineKeyHandler predefinito per PowerShell. Sembra che rimanga bloccato sul comando, ma se inizi a digitare apparirà la riga successiva. Avrete bisogno di aggiungere entrambi questi al vostro Microsoft.Powershell_Profile.ps1 situato in $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 
} 

Speriamo che aiuta!