2021年3月3日水曜日

PowerShellのスクリプトをタスクスケジューラに登録し定期的に指定のURLからファイルをダウンロードする

ひょんなことから限られたリソース・期間でServicenowにインターネットに口のないURLからデータをダウンロードしてPCで中継してSNOWのテーブルへ更新インポートする様な仕組みを作らねばならなくなった(執筆時点では出来るかどうか不明)。

(きっかけはServicenowだが本記事では基本的にWindowsのPowerShellでネットワーク上のファイルをタスクスケジューラを使って定期的に自動取得する仕組みを検討している)

まず今回は元ネタになるファイルのダウンロードの仕組みから検討してみる。

制約条件はWindows10を使用し追加のソフトウェア購入予算無し。

必然的に選択肢は.batか.ps1か.vbsあたりが想定される。

.batでもよいが、将来単なるダウンロードではなく、ログインやら条件分岐やら複雑な事をやろうと思ったときに、スクリプトが困難になる恐れあり、VBSは悪く無いが、経験上今一安定的に動かす用途には難しそう、かつMSさんはvbsを止めたがっている疑惑が個人的に止まらない。

という事でコマンドが直感的に打ちにくくて好きではなくこれまで敬遠してたが、PowerShellでやってみることにする。

大きく二つ方法があるらしく、PowerShell2.0までは、WebClientというオブジェクトを呼ぶやり方、PowerShell3.0からはInvoke-WebRequestというコマンドが使えるらしい。

New obj.webclientみたいなのがたくさん続くスクリプトは旧世代脳の私にはつらいので、Invoke-WebRequestコマンドで行けるならこれでやりたいが、自分のPCのPowerShellのバージョンがわからん。versionとかコマンド打ってもエラー。。。

だからPowerShellは嫌いなんだ。

といっていても始まらないので調べる。

PS C:\> $PSVersionTable

Name                           Value 
----                           -----
PSVersion                      5.1.19041.610
PSEdition                      Desktop
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0...}
BuildVersion                   10.0.19041.610
CLRVersion                     4.0.30319.42000
WSManStackVersion              3.0
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1

これでわかるらしい。ダラー($)なんて思いつかねーよ(愚痴)。

ともあれInvoke-WebRequestが使えるバージョンなのは分かった。

結論としてはダウンロード自体は簡単。

PS C:\> Invoke-WebRequest "https://jvndb.jvn.jp/ja/feed/detail/jvndb_detail_2021.rdf" -OutFile "jvndb_detail_2021.rdf"
PS C:\>

これで完了(URL例はJVNの2021年番rdf)。

で、このコマンドを.ps1って拡張子でダブルクリックしたら!実行できない(笑)

どうやらPowerShellのスクリプトをGUIから直接起動で実行する事はそもそも不可らしい。なってこったい。余計なお世話してくれる。

.batか.vbsで良かったかも、と少し後悔。

調べてみたところショートカットを作成しリンク先を「powershell -ExecutionPolicy RemoteSigned -File <your ps1 file>」って感じで指定する方法と.batファイルから呼ぶ方法がありそう。って、結局バッチファイルかい。

納得いかないので、もうちょっと深堀してみたらタスクスケジューラからならスクリプトファイルを直接指定して実行できるらしいので試してみる。

タスクスケジューラを起動し操作→基本タスクの作成


適当に名前や実行タイミング等を決め、


「プログラム/スクリプト」には、「%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe」

「引数の追加(オプション)(A)」には、「-executionpolicy bypass -Command ".\filedownload.ps1"」

「開始(オプション)(T)」には、作業フォルダ「C:\」

等と指定する。

ちなみに、引数として「-executionpolicy bypass」を指定しないとタスクスケジューラ上の実行結果が0x1となりエラーも特に出力されないが実質何も実行されていない状態となり、戸惑う事になる。

手動では問題なく実行できる構文であるが、どうやらタスクスケジューラから起動する場合とGUIでPowerShellのウィンドウを起動した場合ではexecutionpolicyが違うのか?

また-CommandのキーワードはPowerShellのバージョン6.0以降では-fileとなるらしい。とりあえずうちのPCは5.xなのでCommandで。

とりあえず色々と面倒なつくりは嵌るのでやめてほしい。。。

また、タスクスケジューラから設定したタスクを開き、以下の様にとりあえず最上位の特権で実行するにしておく。

これでひとまず完成。自動でファイルがダウンロードできるようになった。

この状態では同名ファイルは自動上書きなのでそこの処理が必要であれば.ps1の中で書いておけばよいだろう。

次回はServicenow側から更新インポート用のファイル(sys_id付きのエクセル)をダウンロードするのにチャレンジしてみよう。→次回記事

ちなみにタスクスケジューラではなくスクリプト自体をダブルクリックで簡単に起動したい場合はこちらの記事を参照:PowerShellのスクリプトをダブルクリックで起動する

0 件のコメント:

ウェブサイトのURLにおけるトレイリングスラッシュの解釈と有無による動作の違い

インターネットが現代社会におけるコミュニケーションの基盤となっている今日、ウェブサイトのURLはビジネスや個人ブランディングにとって重要な役割を果たしています。URLは単にウェブページへの経路を示すだけでなく、SEO(検索エンジン最適化)においても重要な要素です。この記事では、U...