PowerShellスクリプトをショートカットやタスクスケジューラから実行する方法
本エントリーの目次
これまでバッチファイル(*.bat)を使って実行していた自動化処理を、Windows PowerShellを使った処理に変更しようと、PowerShellスクリプトのファイル(*.ps1)を作成。
そして対象のPowerShellスクリプトファイルを実行するために、ショートカットファイルやスケジュールタスクを作って実行したところ、正常に処理が実行されず困ってしまうことがあります。
PowerShellスクリプトが、ショートカットやタスクスケジューラから実行できない!?
バッチファイル(*.bat)では、対象のファイルに対してショートカットファイルを作成し、それをダブルクリックすることで処理を実行できました。
しかし同様の操作をPowerShellスクリプトのファイル(*.ps1)に対して行った場合、PowerShellスクリプトの内容がメモ帳に表示されはするものの…。
ファイル内に記載されている処理が実行されることはありません。
また、タスクスケジューラでタスクの『操作』に『プログラムの開始』を設定。
そして『プログラム/スクリプト』にバッチファイルのフルパスを指定したケースでは、処理が実行されます。
対して、『プログラム/スクリプト』にPowerShellスクリプトファイルのフルパスを指定した場合では処理が実行されず、ファイルを開く方法の選択画面※1が表示されるはずです。※2
※1 『このファイルを開く方法を選んでください。』というメッセージが表示されている画面。
※2 一瞬選択画面が表示された後、すぐに消えてしまうケースもあります。
これら事例のようにPowerShellスクリプトは、バッチファイル(*.bat)で動作していたショートカットやタスクスケジューラの設定方法では、正常に起動できないケースがあるのです。
今回はPowerShellスクリプトファイルの処理を、ショートカットファイルやタスクスケジューラから実行する方法をご紹介しますので、正常に動作せず困っている方は、ぜひ参考になさってください!
はじめに
本エントリーで紹介している手順や使用しているPowerShellスクリプトの動作については、PowerShellの実行ポリシーをRemoteSignedに設定したWindows 10 1909で、正常に動作することを確認しています。
ですが以前のバージョンのWindowsでは、一部の処理が正常に動作しない可能性があります。
また、これからご紹介する手順ではすべて、『C:\PowerShell Scripts\test.ps1』というパスに保存されている、管理者としての実行が不要なPowerShellスクリプトファイルを実行する前提で説明しています。
管理者としての実行が必要なPowerShellスクリプトファイルを実行する場合には、本エントリーで紹介している設定手順に加え、管理者として実行するための追加の手順などが必要となります。
以上の点について、あらかじめご了承ください。
PowerShellスクリプトファイルの処理を、ショートカットやタスクスケジューラから実行する方法(引数なし)
PowerShellスクリプトファイルの処理を、ショートカットやタスクスケジューラから実行する場合、引数の有無によって設定方法が少し異なります。
そのため、まずは引数がないPowerShellスクリプトファイルのケースについて、設定方法をご紹介しましょう!
ショートカットファイルを使って実行する方法(引数なし)
PowerShellスクリプトファイルの処理をショートカットファイルを使って実行する場合は、まずは通常の手順で対象のファイルへのショートカットファイルを作成してください。
参考:ファイルのショートカットをWindows PCのデスクトップに簡単に作成する方法
すると以下のようなアイコンのショートカットファイルが作成されます。
次に、このショートカットファイルのプロパティ画面を開き、『リンク先』を確認してください。
通常の手順でショートカットファイルを作成した場合、『リンク先』にはPowerShellスクリプトファイルのフルパスが設定されているはずです。
この部分の設定を、以下のような形式の設定値に変更してください。(シングルクォートの間にPowerShellスクリプトファイルのフルパスを指定する。)
1 | powershell -c "&'C:\PowerShell Scripts\test.ps1'" |
設定値を変更すると、ショートカットファイルのアイコンが以下のように変わります。
そしてこのアイコンをダブルクリックすることで、PowerShellスクリプトファイルの処理が実行されます。
タスクスケジューラを使って実行する方法(引数なし)
PowerShellスクリプトファイルの処理をタスクスケジューラを使って実行する場合は、『全般』タブや『トリガー』タブなど設定項目の多くについて、バッチファイルを実行するタスクと同じ設定で大丈夫。
そして異なるのは、『操作』タブの『プログラム/スクリプト』部の設定内容です。
冒頭にも書いたとおりバッチファイルでは、『プログラム/スクリプト』にバッチファイルのフルパスを指定することで処理が実行されます。
ですがPowerShellスクリプトファイルを実行するケースでは、ファイルのフルパス指定では正常に処理が実行されません。
そこで処理を実行するために、『プログラム/スクリプト』と『引数の追加(オプション)』の設定値を、たとえば以下のような形式で指定すると良いでしょう。
1 2 3 4 5 | #『プログラム/スクリプト』 powershell #『引数の追加(オプション)』 -c "&'C:\PowerShell Scripts\test.ps1'" |
上記形式の設定により、タスクスケジューラを使ったPowerShellスクリプトファイルの処理が、正常に実行されるようになるはずです。
PowerShellスクリプトファイルの処理を、ショートカットやタスクスケジューラから実行する方法(引数あり)
引数があるPowerShellスクリプトファイルを実行したいときは、以下のような方法を参考に設定を行ってください。
ショートカットファイルを使って実行する方法(引数あり)
PowerShellでは、名前(変数名)や型を指定しない引数と、名前や型を指定する引数などを扱うことが可能です。
前者は『$Args』という変数に、配列形式で順番にデータが格納されます。
たとえば1番目の引数に11、2番目の引数に22というデータを指定してPowerShellスクリプトファイルを実行した場合、$Args[0]に11。
そして$Args[1]に22が格納される、という仕組みです。
また後者では、PowerShellスクリプトファイル中で以下のような引数の名前と型の指定を行います。
1 | Param([String]$Arg1, [Int]$Arg2, [Bool]$Arg3) |
この指定では、以下の引数を定義していることになります。
- String型の引数$Arg1
- Int型の引数$Arg2
- Bool型の引数$Arg3
今回の説明では、以下PowerShellスクリプトファイルを実行する事例を使って、名前や型を指定しない引数と指定する引数の両方について説明を行いましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #パラメーターの変数名と型を定義 Param([String]$Arg1, [Int]$Arg2, [Bool]$Arg3) #カレントディレクトリを、PowerShellScriptファイルが保存されているフォルダーに変更する Set-Location $PSScriptRoot $Data = @( ('$Arg1 = ' + $Arg1), ('$Arg2 = ' + $Arg2), ('$Arg3 = ' + $Arg3), ('$Args[0] = ' + $Args[0]), ('$Args[1] = ' + $Args[1]), ('$Args[2] = ' + $Args[2]) ) #取得した引数データを、result.txtにファイル出力する $Data | Out-File "result.txt" -Encoding utf8 |
ショートカットファイルを使った引数があるPowerShellスクリプトファイルの実行は、ショートカットファイルを使って実行する方法(引数なし)と同様の手順で操作を行い、『リンク先』の指定を以下のような形式に変更するだけでOK!
1 | powershell -c "&'C:\PowerShell Scripts\test.ps1' 変数名指定なし引数1 変数名指定なし引数2 変数名指定なし引数3 -Arg1 'C:\PowerShell Scripts\test.ps1' -Arg2 500 -Arg3 $true" |
この『リンク先』が指定されたショートカットファイルをダブルクリックで実行すると、『C:\PowerShell Scripts\result.txt』というパスに以下ファイルが出力されます。
1 2 3 4 5 6 | $Arg1 = C:\PowerShell Scripts\test.ps1 $Arg2 = 500 $Arg3 = True $Args[0] = 変数名指定なし引数1 $Args[1] = 変数名指定なし引数2 $Args[2] = 変数名指定なし引数3 |
また、名前(変数名)を指定する引数については順番を気にする必要がないため、『リンク先』の指定値が以下であった場合にも、同様の結果ファイルが出力されます。
1 | powershell -c "&'C:\PowerShell Scripts\test.ps1' 変数名指定なし引数1 -Arg3 $true 変数名指定なし引数2 -Arg2 500 変数名指定なし引数3 -Arg1 'C:\PowerShell Scripts\test.ps1'" |
名前(変数名)を指定しない引数については、配列形式で指定した順番に『$Args』変数にデータが格納されます。
したがって引数を指定する順番には注意が必要です。
タスクスケジューラを使って実行する方法(引数あり)
タスクスケジューラを使った引数があるPowerShellスクリプトファイルの実行も、まずはタスクスケジューラを使って実行する方法(引数なし)と同様の手順で設定を行います。
そして『プログラム/スクリプト』と『引数の追加(オプション)』の設定値について、以下のような形式で指定してください。
1 2 3 4 5 | #『プログラム/スクリプト』 powershell #『引数の追加(オプション)』 -c "&'C:\PowerShell Scripts\test.ps1' 変数名指定なし引数1 変数名指定なし引数2 変数名指定なし引数3 -Arg1 'C:\PowerShell Scripts\test.ps1' -Arg2 500 -Arg3 $true" |
このタスクを設定することで、『トリガー』として指定した条件を満たしたときにPowerShellスクリプトを実行。
そして『C:\PowerShell Scripts\result.txt』というパスにファイルが出力されます。
以上、参考になさってくださーい!