はじめに
PowerShellのスクリプトをダブルクリックで起動する方法として、ショートカットを作成する方法がある。
上記URLの通り、自分でショートカットを設定すればよいのだが、面倒なので、このショートカットをドラッグ&ドロップして、自動で作成したい。
作成したPowerShellスクリプトの概要
起動用ショートカットを作成したいPowerShellスクリプトを、作成したPowerShellスクリプトにドラッグ&ドロップすると、起動用のショートカットをドラッグ&ドロップしたスクリプトと同じフォルダに作成する。
作成したショートカットは、スクリプトの起動時に画面を表示しない設定としている。
また、複数のスクリプトをまとめてドラッグ&ドロップできるようにした。
以下URLのコメント欄にて、ショートカットのプロパティの作業フォルダを空に、リンク先をファイル名だけにして、相対パスとすることで、フォルダを移動してもそのまま使えるとのことだったので、相対パスでショートカットを作成する仕様とした。
作成したPowerShellスクリプト
相対パス版PowerShellスクリプト
if($Args.Count -eq 0){
$f = Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show($f,"ファイルがドロップされていません。処理を終了します。","メッセージ",[System.Windows.Forms.MessageBoxButtons]::OK)
exit
}
$Args | foreach{
$myfile = Get-Item -LiteralPath $_
$workfile = $myfile.Name
$linkfile = $myfile.BaseName + "_Run.lnk"
$workfolder = $myfile.DirectoryName
$opt = "-ExecutionPolicy RemoteSigned -WindowStyle Hidden -File "
$WsShell = New-Object -ComObject WScript.Shell
$Shortcut = $WsShell.CreateShortcut((Join-Path $workfolder $linkfile))
$Shortcut.TargetPath = "powershell"
$Shortcut.Arguments = $opt + '"'+ $workfile + '"'
$Shortcut.WorkingDirectory = ""
$Shortcut.WindowStyle = 7
$Shortcut.Save()
}
絶対パス版PowerShellスクリプト
補足として、絶対パス版のスクリプトも載せておく。
ショートカットのプロパティの作業フォルダを指定し、リンク先のファイル名をフルパスにする。
if($Args.Count -eq 0){
$f = Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.MessageBox]::Show($f,"ファイルがドロップされていません。処理を終了します。","メッセージ",[System.Windows.Forms.MessageBoxButtons]::OK)
exit
}
$Args | foreach{
$myfile = Get-Item -LiteralPath $_
$linkfile = $myfile.BaseName + "_Run.lnk"
$workfolder = $myfile.DirectoryName
$opt = "-ExecutionPolicy RemoteSigned -WindowStyle Hidden -File "
$WsShell = New-Object -ComObject WScript.Shell
$Shortcut = $WsShell.CreateShortcut((Join-Path $workfolder $linkfile))
$Shortcut.TargetPath = "powershell"
$Shortcut.Arguments = $opt + '"'+ $myfile + '"'
$Shortcut.WorkingDirectory = $workfolder
$Shortcut.WindowStyle = 7
$Shortcut.Save()
}
作成したスクリプトの実行について
上記の作成したPowerShellスクリプト(CreateLaunchShortcut.ps1)にドラッグ&ドロップするには、作成したスクリプトの起動用のショートカットが必要となる。手作業でショートカットを作成してもよいのだが、せっかくこの作成したスクリプトがあるので活かしたい。
作成したスクリプトに作成したスクリプト自体を渡すため、上記URLを参考に、起動用ショートカットの代わりにバッチファイルを作成し、バッチファイルに作成したスクリプトをドラッグ&ドロップして渡すことで、起動用ショートカットを作成することができた。
@echo off
rem 引数がない場合は終了する
if "%~1"=="" (
echo 引数がありません
pause
exit /b
)
pushd %~dp0
powershell -executionpolicy RemoteSigned -File "CreateLaunchShortcut.ps1" %1
サンプルファイル保存先:
注意事項(2025/7/7追記)
スクリプト起動用のショートカットを自動作成するスクリプトについて、相対パスで起動用ショートカットを作成した場合、そのショートカットにドラッグ&ドロップすると、ドラッグ&ドロップしたファイルの存在するフォルダがカレントフォルダとして認識されるようだ。
そのため、相対パスの起動用ショートカットへ、別のフォルダからファイルをドラッグ&ドロップすると、ショートカットのあるフォルダではなく、ドラッグ&ドロップしたファイルの存在するフォルダからスクリプトを実行しようとするため、スクリプトが存在せず、失敗する。
別フォルダからファイルをドラッグ&ドロップするのであれば、スクリプトの起動用ショートカットは絶対パスで作成するとよい。