検索すると 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.txt
と fuga.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 ファイルの新規保存時にデスクトップへ保存してしまうことが多いので重宝しています。