- Excelを操作するPowerShellスクリプトの書き方
- PowerShellスクリプトをタスクスケジューラから起動する方法
- OfficeアプリケーションをCOM経由で操作する
- タスクスケジューラから起動
PowerShellから動作するスクリプトがタスクスケジューラから起動すると正常に動作しない
作成したスクリプトは複数のPowerPointファイルを1ファイルにまとめるスクリプトで、やりたかったのは、週に1度ある時刻にこのスクリプトを自動的に実施するということでした。PowerShellスクリプトでPowerPointファイルを処理する方法についてはインターネット上を検索すれば情報が得られます。大きな苦労をすることなく1ファイルにまとめるスクリプトは完成し、PowerShellから起動する分には問題なく動作していました。ところが、同じスクリプトをタスクスケジューラから起動するように設定しても、まったく目的の処理がされないという事態に直面したのです。PowerShellスクリプトをタスクスケジューラから正常起動できているか確認
最初は自分の単純な設定ミスだと思っていたため、タスクスケジューラでの設定をいろいろ調べて調整してみたのですが、どうもそれでは解決しません。どうも簡単な問題ではないことが分かってきたので、地道に問題の切り分けを行うことにしました。まずは簡単なテキストファイルを作成するPowerShellスクリプトを作成し、それをタスクスケジューラから起動してみました。すると何の問題もなく動作します。これでタスクスケジューラからスクリプトがキックされていないということは無いことが分かりました。
今回の処理を実現するため、PowerShellスクリプトからPowerPointファイルを操作するのにCOMを使っています。問題の切り分けの次の段階としてPowerPointを起動し、ファイルをオープンするだけのスクリプトを作成し、タスクスケジューラから実行するようにしてみました。すると、今度は挙動が変わってしまい、上手く動作しません。更に絞り込んでいってみると、COMオブジェクトを作成する"New-Object -ComObject"が失敗し$nullを返していることが分かりました。ここまで分かれば、インターネットでソリューションを探すことができるだろうと検索してみましたが、なかなか同様の問題が見つかりません。まれに見つかっても(操作対象がPowerPointではなくExcelだったりするものの)質問があるだけで、解決に至っていないものでした。New-Object -ComObjectに失敗している
解決方法はフォルダを作るだけ?
C:\Windows\System32\config\systemprofile\Desktop
C:\Windows\SysWOW64\config\systemprofile\Desktop
(試したのはWindows 7 64bit環境になります)
というフォルダーを作成すると良いというものでした。フォルダー作るだけ?何でこのフォルダー?と頭の中には疑問符が幾つも浮かびましたが、これしか情報が無かったので実際にやってみることにしたのです。
権限を変更したら動いた

具体的には「最上位の特権で実行する」にチェックを入れて試したところ、問題切り分け用に作成したスクリプトが狙い通りに動作するようになったのです。徐々にスクリプトでやる内容を増やしていき、最終的には当初の目的のスクリプトが正常に動作することが確認できました。
何故この"Desktop"フォルダーを作成すると問題が解決するのかの理由も調べてみましたが、未だに分かっていません。もしかしたら、今回の私の環境ではたまたま動作するが、一般環境で必ず動作することをMicrosoftが保証していない設定なのかもしれません。
注意点のまとめ
Officeアプリケーションを操作するPowerShellスクリプトをタスクスケジューラから自動起動するには、
そもそも何故このような自動化をしようと思ったのかですが、ルーチンワークをできるだけ自動化し、人間が介在しないと出来ない仕事に注力したかったからです。この情報が同様の考えを持つ方の参考になれば幸いです。- Windows 7 64bit版では以下の2つのフォルダーを作成するC:\Windows\System32\config\systemprofile\Desktop
C:\Windows\SysWOW64\config\systemprofile\Desktop - タスクスケジューラからスクリプトの実行は「最上位の特権で実行する」設定とする必要があります。
0 件のコメント:
コメントを投稿