21
20

【powershell】アプリ起動ランチャー作ってみた

Last updated at Posted at 2024-06-06

<はじめに>

Windows10サポート終了が告知され、会社の端末もWindows11に切り替わりました。
Windows11になったことにより、Windows10で個人的に使用していた「ツールバー」が無くなっていました😭
(よく使うアプリとかフォルダとか設定できて便利だったのに・・)

(´・x・).oO◯( ないものはしょうがないね・・

さて、
アプリ起動ランチャーほしいけど、会社端末なので勝手にツールをインストールできない。


とりあえず、
Windowsアプリっぽいものが作れそうなpowershellをやってみよう、会社の端末にデフォルトで入ってるし。(本当はpythonやってみたけど、インストール必要だし)

>やりたいこと・・
・アプリ起動ランチャー的なやつがほしい
・タスクバーに常駐する
・指定したフォルダ内にあるショートカットファイルを一覧で表示して、選択すると起動するみたいな感じ
・起動する際に、見るフォルダを指定できる

<作ってみた>

参考ページをベースに、
・パラメータを取得を追加
・アイコン取得やメニューの処理を変更

参考ページ : 私PowerShellだけど、君のタスクトレイで暮らしたい
→ 参考になりました。ありがとうございます。

launcher.ps1
param(
    [string]$arg1 # 引数としてフォルダのパス
)
Add-Type -AssemblyName System.Windows.Forms

$MUTEX_NAME ="Global\mutex"

# 重複起動防止
$mutex = New-Object System.Threading.Mutex($false, $MUTEX_NAME)

if($mutex.WaitOne(0, $false)){
    
    $application_context = New-Object System.Windows.Forms.ApplicationContext
    # とりあえず、explorerのアイコンを拝借
    $icon = [System.Drawing.Icon]::ExtractAssociatedIcon("C:\Windows\explorer.exe")

    # タスクバー
    $notify_icon = New-Object System.Windows.Forms.NotifyIcon
    $notify_icon.icon = $icon
    $notify_icon.Visible = $true
    $notify_icon.Text = "アプリ一覧"

    # メニューを作成(exit)
    $menuExit = New-Object System.Windows.Forms.ToolStripMenuItem
    $menuExit.Text = "Exit"
    $menuExit.Image = $icon
    $menuExit.add_click({
        # クリックしたら終了させる
        $application_context.ExitThread()
    })
    $notify_icon.ContextMenuStrip = New-Object System.Windows.Forms.ContextMenuStrip
    $notify_icon.ContextMenuStrip.Items.Add($menuExit)

    # メニューに区切り線を追加
    $sep = New-Object System.Windows.Forms.ToolStripSeparator
    $notify_icon.ContextMenuStrip.Items.Add($sep)

    # フォルダにあるショートカットファイルを取得
    foreach( $file in (Get-ChildItem "$arg1*.lnk" -File )){
        
        # メニューを作成(各ショートカットファイル)
        $menu = New-Object System.Windows.Forms.ToolStripMenuItem
        $menu.Text = $file.Name.replace(".lnk","")
        $menu.Tag = $file.FullName
        $menu.Image = [System.Drawing.Icon]::ExtractAssociatedIcon($file.FullName)
        $menu.add_click({
            # フルパスを指定して起動
            Invoke-Item $this.Tag
        })
        $notify_icon.ContextMenuStrip.Items.Add($menu)
        
    }
    # アプリを起動
    [void][System.Windows.Forms.Application]::Run($application_context)

    $notify_icon.Visible = $false
    $mutex.ReleaseMutex()
}
$mutex.Close()


あと、powershellのウィンドウが出っ放しになるので、起動する際はvbsからやる。
launcher.vbs
Dim obj
Set obj = WScript.CreateObject("WScript.Shell")
obj.Run "powershell.exe -ExecutionPolicy RemoteSigned -File C:\\work\\launcher.ps1 C:\\work\\tool\\" , 0

<出来上がり>

指定のフォルダを用意
スクリーンショット 2024-06-06 212303.png

launcher.vbsを実行
スクリーンショット 2024-06-06 212525.png

タスクバーにエクスプローラーのアイコンが表示された
スクリーンショット 2024-06-06 212808.png

右クリックで指定フォルダのショートカットファイル一覧が表示された
スクリーンショット 2024-06-06 215323.png

( ´ー`).oO◯( 意外とイメージ通り出来た・・

<おわりに>

・ぶっちゃけ、Windows PowerShell ISE より Visual Studio Code のほうが使いやすい。

・add_clickの処理内で、自身のオブジェクトを取得する方法がわからず苦戦した。($thisで取れるらしい📝)

21
20
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
21
20