Dans PowerShell, comment diriger la sortie d'une commande vers le presse-papiers mais
clip.exe
?
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
Si vous disposez de WMF 5.0, PowerShell contient deux nouvelles applets de commande:
get-clipboard et set-clipboard
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 )
}
}
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.