2012-10-29 12 views
19

In Powershell, wie wollen Sie Rohr die Ausgabe eines Befehls in die Zwischenablage aberRohr Ausgabe in die Zwischenablage mit Powershell

  • Noch in der Lage sein, die Daten zu Rohr zu mehreren Prozessen
  • keine Abhängigkeiten von externen Anwendungen wie clip.exe
  • für sie als Filter zu arbeiten, so dass wir sehen, Ausgabe auf der Kommandozeile sofort

?

EDIT: 14. Mai 2015

Nach 3 Jahren, dachte ich, ich würde meine teilen ClipboardModule (ich hoffe, ich darf):

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 * 

ich in der Regel verwenden Sie die cb alias (für GetSet-Clipboard), weil es zwei Wege, dh ist die Zwischenablage und festlegen:

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

Warum wollen Sie nicht 'clip' benutzen? –

+0

Caleb - So kann ich die Ausgabe in der Befehlszeile auch sehen. –

+4

Tahir, was ist los mit 'Get-Foo | Tee-v Ausgang; $ Ausgabe | Clip' dann? – Joey

Antwort

3

EDIT: Bitte schauen Sie sich die Frage zur Lösung an.

Hier ist meine Lösung:

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 = @() 
    } 
} 

Dieser sammelt alle Objekte in einem Array, $cp. Wir verwenden Tee-Object, um das aktuelle Element, $_, zum nächsten Prozess umzuleiten und es im Array $cp zu speichern. Schließlich, sobald der Prozess abgeschlossen ist, legen wir den Text der Zwischenablage fest.

Ich habe es in der folgenden Art und Weise verwendet:

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

Und es scheint zu funktionieren.

eine Funktion stattdessen verwenden:

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

Es gibt eine nette Implementierung hier http://stackoverflow.com/questions/1567112/convert-keith-hills-powershell-get-clipboard-and-set-clipboard-to-a-psm1-script – EBGreen

+0

Dort; Wenn Sie stattdessen das Filter-Schlüsselwort verwenden, sollten Sie stattdessen Funktion verwenden. –

+2

Ich kann den Vorteil sehen, nur die Zwischenablage Daten zu setzen, wenn die Daten nicht leer oder Null sind, aber was ist der Punkt der ersten Zwischenablage löschen? – Sam

2

Werfen Sie einen Blick auf Lee Holme Rezept aus der Powershell-Kochbuch: Set-Clipboard. Sie können als Set-Clipboard.ps1 verwenden oder einfach den Code innerhalb einer PowerShell-Funktion (here's an example aus meinem PowerShell-Profil) löschen. Natürlich wird die Ausgabe nicht automatisch angepasst, aber das sollte einfach genug sein.

Ich lernte ursprünglich Lee Holmes Lösung von this answer.

13

Wenn Sie WMF haben 5.0, enthält zwei neue Powershell-Cmdlets:

get-Zwischenablage und Set-Zwischenablage

+0

In diesem Fall können Sie 'GetSet-Clipboard' und den handlichen Alias' cb' definieren, um diese beiden Cmdlets einfacher zu machen ':-)' –

+0

Sie sind zu hundert Prozent richtig, mein Freund. Aber ich habe das letzte Mal, als ich einen Alias ​​in einer Stack Overflow-Antwort verwendet habe, verloren. . Tahir bezieht sich auf die integrierten SCB- und GCB-Cmdlets. Was noch besser ist, ist, dass sie "clipboard smart" sind, so wie es clip.exe nie war. –

Verwandte Themen