ショートカットからの.ps1起動と問題点

ショートカットからの.ps1起動について

PowerShellのスクリプトファイル(.ps1)はダブルクリックで実行することができない。

代替法の一つとして「.ps1ファイルへのショートカットを作成し、そのショートカットでPowerShellを呼び出すよう設定することで、ショートカットのダブルクリックから当該.ps1の直接実行を可能にする」という方法がある。

以下、方法と問題点を説明。

(後述の問題点のため、自分が制作したツールではショートカットからの.ps1起動方式を採用しなかった)

方法

実行したい.ps1ファイルのショートカットを作成し、プロパティから設定を以下のように変える。

項目名 設定値
リンク先 %windir%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File .\ファイル名.ps1
作業フォルダー (空欄にする)

↑「リンク先」の設定値の中にある「ファイル名」は実行したい .ps1ファイルのファイル名にする

これで同じディレクトリにあるスクリプトをダブルクリックで実行できる。

  • リンク先の欄で、同じディレクトリ内にあるPowerShellスクリプトを相対パスでPowerShellに渡して起動させるようにしている
  • 作業フォルダーを空欄にしておけば、基本的にこのショートカットを起動した場所がカレントディレクトリ(作業フォルダ)になる (※致命的な例外あり)

ショートカット起動の問題

ファイルをショートカットにドラッグ&ドロップで渡した瞬間にカレントディレクトリが(ショートカットがある場所ではなく)ドラッグ&ドロップしたファイルがあるディレクトリになってしまう

これにより、相対パスで指定している.ps1ファイルが見つからずエラーが出る。 (ショートカットがある場所からの相対パスではなく、ドラッグ&ドロップしたファイルがある場所からの相対パスとして認識されてしまう。)

つまり、ショートカットの場合は相対パスでの.ps1指定とドラッグ&ドロップによるファイル渡しが両立できない

※追記:ショートカットの相対パス指定を工夫すればこの問題が解決できるかも(未検討)

詳しくは下記サイト参照。

リンク:相対パスを指定して、UAC が働く「管理者として」、バッチを起動するショートカットを作る

↑ショートカットを「管理者として実行」するとカレントディレクトリが勝手に %SystemRoot%\system32 になってしまうという情報もあり。

結論

ショートカットに何もファイルをドラッグ&ドロップする予定がなければこの方法で問題ない。

D&Dするファイル操作系の.ps1スクリプト等なら、ショートカット起動方式ではなくバッチ経由起動方式にすればこの問題を回避しつつダブルクリック実行できる。

ただ、いちいち.ps1を呼び出すバッチファイルを毎回作成するのは面倒なので、.ps1ファイルから起動用バッチを自動で生成するツールを作った。

以下のページからダウンロードできるのでよろしければ是非…!

バッチ生成ツール

PowerShellスクリプト(.ps1)は設定を行わなければそもそもデフォルトで実行不可になっているうえ、バッチファイル(.bat)と異なりダブルクリックでの実行もできません。 実行が非常に不便なPowerShellスクリプトをどうにか[…]

記事化前の最新情報はこちらで先にツイートしています。サイト更新告知もこちら。