xlogI125’s blog

パソコン作業を効率化したい

PowerShell: Windowにドラッグ&ドロップされたファイルのパスを表示

対象のファイルが各フォルダに分散していることが多くなり、ファイルをショートカット(*.lnk)アイコンへドラッグ&ドロップする方法では不都合な場合が多くなった。

Window(System.Windows.Window)へのドラッグ&ドロップを考える。

# PowerShell 5.1, Windows 11 (2024年8月頃)

Set-StrictMode -Version Latest

$paths = [System.Collections.Specialized.StringCollection]::new()

Add-Type -AssemblyName PresentationFramework

$w = New-Object -TypeName System.Windows.Window -Property @{
  Title = "ドラッグ&ドロップ"
  Width = 300
  Height = 200
  AllowDrop = $true
}

$xaml = [System.Windows.Markup.XamlWriter]::Save($w)
<#
$xaml = @'
<Window 
  Title="ドラッグ&amp;ドロップ" 
  Width="300" 
  Height="200" 
  AllowDrop="True" 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" />
'@
#>

$stringReader = [System.IO.StringReader]::new($xaml)
$xmlReader = [System.Xml.XmlReader]::Create($stringReader)
$window = [System.Windows.Markup.XamlReader]::Load($xmlReader)

# add_Drop Method の確認
# $window | Get-Member -Force | Where-Object Name -Match '^add_.*(drag|drop)' | Out-GridView

$window.add_Drop([System.Windows.DragEventHandler]{
  param([object]$sender, [System.Windows.DragEventArgs]$e)

  $Local:paths = [string[]]$e.Data.GetFileDropList()
  $Local:paths | Write-Host -ForegroundColor Cyan

  $Global:paths.AddRange($Local:paths)

<#
  # スコープの確認
  @(Get-Variable -Scope Global | Select-Object -Property @{Name = "Scope"; Expr = {"Global"}}, *) + 
  @(Get-Variable -Scope Local  | Select-Object -Property @{Name = "Scope"; Expr = {"Local"}} , *) + 
  @(Get-Variable -Scope Script | Select-Object -Property @{Name = "Scope"; Expr = {"Script"}}, *) | 
  Sort-Object -Property Name, Scope | Where-Object Name -Match 'paths' | Out-GridView
#>
})

$null = $window.ShowDialog()

$paths | Write-Host -ForegroundColor Magenta

過去記事

dy100ms.hatenadiary.jp