2012-10-29 13 views
19

In PowerShell, come si fa inviare l'output di un comando negli appunti, mauscita del tubo negli appunti utilizzando PowerShell

  • ancora in grado di pipe i dati a più processi
  • dipendenze da applicazioni esterne come clip.exe
  • per farlo funzionare come un filtro, così vediamo uscita sulla linea di comando immediatamente

?

EDIT: 14 maggio 2015

Dopo 3 anni, ho pensato di condividere la mia ClipboardModule (spero mi è permesso di):

Add-Type -AssemblyName System.Windows.Forms 

Function Get-Clipboard { 
    param([switch]$SplitLines) 

    $text = [Windows.Forms.Clipboard]::GetText(); 

    if ($SplitLines) { 
     $xs = $text -split [Environment]::NewLine 
     if ($xs.Length -gt 1 -and -not($xs[-1])) { 
      $xs[0..($xs.Length - 2)] 
     } else { 
      $xs 
     } 
    } else { 
     $text 
    } 
} 

function Set-Clipboard { 
    $in = @($input) 

    $out = 
     if ($in.Length -eq 1 -and $in[0] -is [string]) { $in[0] } 
     else { $in | Out-String } 

    if ($out) { 
     [Windows.Forms.Clipboard]::SetText($out); 
    } else { 
     # input is nothing, therefore clear the clipboard 
     [Windows.Forms.Clipboard]::Clear(); 
    } 
} 


function GetSet-Clipboard { 
    param([switch]$SplitLines, [Parameter(ValueFromPipeLine=$true)]$ObjectSet) 

    if ($input) { 
     $ObjectSet = $input; 
    } 

    if ($ObjectSet) { 
     $ObjectSet | Set-Clipboard 
    } else { 
     Get-Clipboard -SplitLines:$SplitLines 
    } 
} 

Set-Alias cb GetSet-Clipboard 

Export-ModuleMember -Function *-* -Alias * 

io di solito uso l'alias cb (per GetSet-Clipboard) perché è a due vie cioè in grado di ottenere o impostare l'appunti:

cb    # gets the contents of the clipboard 
"john" | cb  # sets the clipboard to "john" 
cb -s    # gets the clipboard and splits it into lines 
+0

Perché non vuoi usare 'clip'? –

+0

Caleb - Quindi posso vedere l'output anche sulla riga di comando. –

+4

Tahir, cosa c'è di sbagliato in 'Get-Foo | tee -v output; $ output | clip' allora? – Joey

risposta

3

MODIFICA: Si prega di guardare invece la domanda per la soluzione.

Ecco la mia soluzione:

Add-Type -AssemblyName 'System.Windows.Forms' 

filter Set-Clipboard { 
    begin { 
     $cp = @() 
    } 
    process { 
     $_ | Tee-Object -Variable 'cp0' 
     $cp = $cp + @($cp0); 
    } 
    end { 
     $str = ($cp | Out-String).ToString(); 

     [Windows.Forms.Clipboard]::Clear(); 

     if (($str -ne $null) -and ($str -ne '')) { 
      [Windows.Forms.Clipboard]::SetText($str) 
     } 

     $cp = @() 
    } 
} 

Questo raccoglie tutti gli oggetti in un array, $cp. Usiamo Tee-Object per reindirizzare l'elemento corrente, $_, sia per il processo successivo che per memorizzarlo nell'array, $cp. Infine, una volta terminato il processo, impostiamo il testo degli appunti.

ho usato nel modo seguente:

dir -Recurse | Set-Clipboard | Select 'Name' 

E sembra funzionare.

Per utilizzare una funzione, invece:

function Set-Clipboard-Func { 
    $str = $input | Out-String 

    [Windows.Forms.Clipboard]::Clear(); 

    if (($str -ne $null) -and ($str -ne '')) { 
     [Windows.Forms.Clipboard]::SetText($str) 
    } 
} 
+0

C'è una bella implementazione qui http://stackoverflow.com/questions/1567112/convert-keith-hills-powershell-get-clipboard-and-set-clipboard-to-a-psm1-script – EBGreen

+0

Lì, non c'è ulteriore vantaggio dell'uso della parola chiave Filter, al contrario, dovresti usare invece Function. –

+2

Riesco a vedere il vantaggio nell'impostare solo i dati degli Appunti se i dati non sono vuoti o nulli, ma qual è il punto di cancellare prima gli appunti? – Sam

2

Date un'occhiata a ricetta di Lee Holme dal PowerShell Cookbook: Set-Clipboard. È possibile utilizzare come Set-Clipboard.ps1, o semplicemente rilasciare il codice all'interno di una funzione di PowerShell (here's an example dal mio profilo PowerShell). A dire il vero, non crea automaticamente l'output, ma dovrebbe essere abbastanza facile da aggiungere.

Originariamente ho appreso della soluzione di Lee Holme dal this answer.

13

Se avete WMF 5.0, PowerShell contiene due nuovi cmdlet:

get-clipboard e set-clipboard

+0

In questo caso puoi definire 'GetSet-Clipboard' e il suo alias pratico' cb' per rendere più semplici questi due cmdlet ':-)' –

+0

Hai ragione al cento per cento, amico mio. Ma mi è stata sculacciata l'ultima volta che ho usato un alias in una risposta Stack Overflow. . Tahir fa riferimento ai cmdlet incorporati scb e gcb. Ciò che è ancora più interessante in loro è che sono "appunti intelligenti" in un modo che clip.exe non è mai stato. –