web-dev-qa-db-fra.com

Diriger la sortie vers le presse-papiers à l'aide de PowerShell

Dans PowerShell, comment diriger la sortie d'une commande vers le presse-papiers mais

  • Être toujours capable de diriger les données vers plus de processus
  • Aucune dépendance aux applications externes telles que clip.exe
  • pour qu'il fonctionne comme un filtre, nous voyons donc immédiatement la sortie sur la ligne de commande

?

EDIT: 14 mai 2015

Après 3 ans, je pensais partager mon ClipboardModule (j'espère avoir le droit de le faire):

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 *

J'utilise généralement l'alias cb (pour GetSet-Clipboard) parce que c'est bidirectionnel, c'est-à-dire que vous pouvez obtenir ou définir le presse-papiers:

cb                # gets the contents of the clipboard
"john" | cb       # sets the clipboard to "john"
cb -s             # gets the clipboard and splits it into lines
22
Tahir Hassan

Si vous disposez de WMF 5.0, PowerShell contient deux nouvelles applets de commande:

get-clipboard et set-clipboard

19
Mark Minasi

EDIT: Veuillez plutôt regarder la question pour trouver une solution.

Voici ma solution:

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

Cela rassemble tous les objets d'un tableau, $cp. Nous utilisons Tee-Object pour rediriger l'élément courant, $_, à la fois pour le processus suivant et pour le stocker dans le tableau, $cp. Enfin, une fois le processus terminé, nous définissons le texte du presse-papiers.

Je l'ai utilisé de la manière suivante:

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

Et cela semble fonctionner.

Pour utiliser une fonction à la place:

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

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

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

Powershell version 6.1 a supprimé cette commandlet, elle n'est donc plus intégrée.

Au lieu de cela, vous devez installer le package ClipboardText . Dans le type de console de Powershell:

Install-Module -Name ClipboardText

Ensuite, vous pouvez utiliser:

 Set-ClipboardText "hello clipboard"
 Get-ClipboardText

Voici le problème de github avec les responsables de Powershell vous redirigeant pour utiliser le package ClipboardText.

2
Donal Mee