1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【PowerShell】ファイルをクリップボードに切り取る

Last updated at Posted at 2020-06-27

検索すると C や VB の記事は出てくるものの PowerShell 版が見つからなかったので。

$target = @("C:\Users\hoge.txt", "C:\Users\fuga.txt")
try {
    $dataObj = New-Object System.Windows.Forms.DataObject
    $dataObj.SetFileDropList($target)
    $byteStream = [byte[]](([System.Windows.Forms.DragDropEffects]::Move -as [byte]), 0, 0, 0)
    $memoryStream = New-Object System.IO.MemoryStream
    $memoryStream.Write($byteStream)
    $dataObj.SetData("Preferred DropEffect", $memoryStream)
    [System.Windows.Forms.Clipboard]::SetDataObject($dataObj, $true)
}
catch {
    Write-Host $_.Exception.Message -ForegroundColor Red
}

こうすると hoge.txtfuga.txt をコンテキストメニューで「切り取り」した状態になり、コピー先のフォルダへの右クリック貼り付けで移動できるようになります。メリットとしてウインドウの数が減ります。

最近は peco でフィルタリングする術を知った ので、下のようなコマンドレットを書いてデスクトップのファイルを UI 選択して……

function Invoke-DesktopItem {
    $arrayList = New-Object System.Collections.ArrayList
    $desktopPath = "{0}\desktop" -f $env:USERPROFILE
    (Get-ChildItem $desktopPath).Name | psPeco -fuzzy | ForEach-Object {
        $item = $desktopPath | Join-Path -childPath $_ | Get-Item
        $arrayList.Add($item) > $null
    }
    return $arrayList
}

このように組み込んでターミナルをエクスプローラ代わりにしています。
psPeco のコードは上記記事参照)

function idx {
    $items = Invoke-DesktopItem
    if (-not $items) {
        return
    }
    $fullnames = @($items.Fullname)
    try {
        $dataObj = New-Object System.Windows.Forms.DataObject
        $dataObj.SetFileDropList($fullnames)
        $byteStream = [byte[]](([System.Windows.Forms.DragDropEffects]::Move -as [byte]), 0, 0, 0)
        $memoryStream = New-Object System.IO.MemoryStream
        $memoryStream.Write($byteStream)
        $dataObj.SetData("Preferred DropEffect", $memoryStream)
        [System.Windows.Forms.Clipboard]::SetDataObject($dataObj, $true)

        Write-Host "CUT item on desktop:" -ForegroundColor Black -BackgroundColor White
        $items | ForEach-Object {
            if ($_.GetType().Name -eq "DirectoryInfo") {
                $color = "Yellow"
            }
            else {
                $color = "Blue"
            }
            "  + '{0}'" -f $_.Name | Write-Host -ForegroundColor $color
        }
    }
    catch {
        Write-Host $_.Exception.Message -ForegroundColor Red
    }
}

ブラウザからのダウンロードや Office ファイルの新規保存時にデスクトップへ保存してしまうことが多いので重宝しています。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?