はじめに
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追記)
スクリプト起動用のショートカットを自動作成するスクリプトについて、相対パスで起動用ショートカットを作成した場合、そのショートカットにドラッグ&ドロップすると、ドラッグ&ドロップしたファイルの存在するフォルダがカレントフォルダとして認識されるようだ。
そのため、相対パスの起動用ショートカットへ、別のフォルダからファイルをドラッグ&ドロップすると、ショートカットのあるフォルダではなく、ドラッグ&ドロップしたファイルの存在するフォルダからスクリプトを実行しようとするため、スクリプトが存在せず、失敗する。
別フォルダからファイルをドラッグ&ドロップするのであれば、スクリプトの起動用ショートカットは絶対パスで作成するとよい。
「管理者として実行」オプションを有効にして作成(2025/9/4追記)
ショートカットを作成する際に、下の図のプロパティの詳細設定にある「管理者として実行」オプションにチェックを入れた状態で作成できないかと思い、調べたので追記する。

動作手順
- ショートカットをバイナリファイルとして開き、バイト配列を読み込む
- バイト配列の「0x15」の位置の値を「0x20」(有効)に変更する
- 変更したバイト配列をショートカットファイルに書き込む
管理者として実行した場合、カレントフォルダは「C:\Windows\System32」となるため、相対パス版のショートカットは実行できない。そのため、管理者として実行を有効にする場合は、絶対パス版でショートカットを作成する。
絶対パス版に追加したPowerShellスクリプト
#管理者として実行オプションを有効にする
$offset = 0x15
$Path = (Join-Path $workfolder $linkfile)
$byteReader = [System.IO.File]::ReadAllBytes($Path)
$byteReader[$offset] = 0x20
[System.IO.File]::WriteAllBytes($Path, $byteReader)
参考URL:
ショートカットを右クリックしてプロパティ→詳細設定→管理者として実行にするPowerShellコマンドって何?