Windows PowerShell から Windows Runtime API を呼びたかった
[Windows.Devices.HumanInterfaceDevice.HidDevice,Windows.Devices.HumaInterfaceDevice,ContentType=WindowsRuntime] [Windows.Devices.Enumeration.DeviceInformation,Windows.Devices.Enumeration,ContentType=WindowsRuntime]
こう書いておくと、
$selector = [Windows.Devices.HumanInterfaceDevice.HidDevice]::GetDeviceSelector($usagePage, $usageId) $async = [Windows.Devices.Enumeration.DeviceInformation]::FindAllAsync($selector)
と、ここまでは書くことができる。しかし PowerShell には非同期サポートがないので、これ以上どうしようもない。
とりあえず Task に変換して sleep しながら IsCompleted を見ればなんとかなるかなと思い以下のようにしてみた
$task = [Windows.Devices.Enumeration.DeviceInformation]::FindAllAsync($selector).AsTask()
これはうまくいかない。AsTask() が存在しないと言われる。WindowsRuntimeSystemExtensions だからしかたないのかな? と思い、さらに以下のように展開してみる
$task = [WindowsRuntimeSystemExtensions]::AsTask([Windows.Devices.Enumeration.DeviceInformation]::FindAllAsync($selector))
これはオーバーロードされているメソッドが見つからないというエラーになる。引数が実行時に型なしになるためだと思い、型指定をつけてみる
$task = [WindowsRuntimeSystemExtensions]::AsTask([Windows.Foundation.IAsyncOperation] [Windows.Devices.Enumeration.DeviceInformation]::FindAllAsync($selector))
これは Windows.Foundation.IAsyncOperation が存在しないと言われてエラーになる。
[Windows.Foundation.IAsyncOperation,Windows.Foundation,ContentType=WindowsRuntime]
を冒頭に足してみるが、ダメ。Foundation だから? わからないけどとにかくダメ。Add-Type とかしてみてもダメ。
結論:PowerShell とかクソ
他の方法
C# でラッパーを書いてロードすればなんとかなる。が、ビルトインの機能でなんとかしたくて PowerShell を使っているのであって、C# で書くなら全部C#で書くわハゲ
関連エントリー
- WSL2 で USB (usbipd-win) https://github.com/dorssel/usbipd-win WSL2 内ではホストの USB デバイスを使うことができないと...
- Mac でウェブカメラの定期撮影を Swift で書く macOS 用にウェブカメラからjpgを取得するコマンドラインツールにimagesnapというのがある。単発で使うには問題ないんだけど、イン...
- LAN 内の mDNS に応答するホストを列挙したい PTR _services._dns-sd._udp.local. A/AAAA [ソースアドレス].in-addr.arpa. をやりたい...
- Spring MVC で @Async と @RequestScope を共存させるには? @Async と @RequestScope を同時につかうとどうなるか @RequestScope、これは @Scope(value = ...