
TechNet コラムへようこそ。このコラムでは、よく寄せられるシステム管理スクリプトに関する質問に Scripting Guys がお答えします。システム管理スクリプトについて質問がある場合は、scripter@microsoft.com (英語のみ) までお送りください。すべての質問に回答することはできないかもしれませんが、可能な限り対応いたします。
詳細情報
| • | |
| • | |
| • |
![]()
Scripting Guy さん、よろしくお願いします。Windows PowerShell で、別のアプリケーションを起動した後、そのアプリケーションが終了するまでスクリプトを一時停止する方法はありますか。
-- AD

AD さん、こんにちは。今日の質問に答える前に、1 つお知らせがあります。それは、Scripting Guys には友人が必要だということです。
いや、そういった友人ではありません。考えてみると、現実の世界の友人にお願いするという手もありますね。でも、今日は、フェースブックでの新しい友人を探しています。今朝、私たちは Scripting Guys 用にフェースブックのページを作成しましたが、悲しいことに、私たちにはあまり友人がいません。実際、グループのメンバには、Greg Stemp (偶然にも Dr. Scripto によく似ています) と Jean Ross (不思議なほど疑問符に似ています) しかいません。

Jean と Greg があまり愉快ではないとは言っているわけではありません。ええ、そうですね。確かに、あまり愉快ではないと言っていることになるかもしれませんね (Greg は問題ありませんが、Jean が疑問符に似ているなんて、とんでもないことです)。そういうわけで、私たちは新しい友人と、Scripting Guys グループの新しいメンバを探しているのです。
申し込むにはどうしたらよいのかというと、このグループに参加するには、まず Facebook.com にアクセスしてフェースブック自体に参加する必要があります。確かに、参加するには、個人プロフィールの作成が必要ですが、心配しないでください。作成したプロフィールを公開したくなければ、完全非公開にすることができます。フェースブックに参加した後、[検索] ボックスに「Scripting Guys」と入力して、Enter キーを押します。検索結果が表示されたら、[グループに参加] をクリックし、[このグループに参加しますか] ダイアログ ボックスが表示されたら、[参加する] をクリックします。その後は、リラックスしてお楽しみください。
何を楽しむかですって。そうですね、正直に言うと、現在のところ、楽しいことはあまりありません。というのも、グループを開設したばかりなので、このグループの活動内容を考えるにはしばらく時間がかかります。ただし、当面は、Scripting Guys とメッセージのやり取りができます。さらに、スクリプト センターでエキサイティングな新しいイベントが行われるときに通知を受けられる簡単な方法もご用意しました。
注 : 「もし、スクリプト センターでエキサイティングな新しいイベントが行われることがあったら」などと言った人はだれですか。皆さんは 2008 年冬季スクリプト競技大会についてもう忘れてしまったんですか。ちなみに、スクリプト競技大会に関するページもあります。「返事をください」というメッセージをいただければ、競技大会の開催前に必ずお知らせのメッセージをお送りします。 |
とにかく、皆さんがグループに参加したり、皆さんの友人や家族にも参加するよう説得していただければさいわいです。感謝の印として、アプリケーションを起動した後、そのアプリケーションが終了するまで一時停止できる Windows PowerShell スクリプトを記述する方法を紹介します。それは、次のスクリプトです。
[System.Diagnostics.Process]::Start("notepad").WaitForExit()
Write-Host "Notepad has terminated."
ご覧のとおり、単純なスクリプトです (もちろん、これは Windows PowerShell のすばらしい点の 1 つで、たった数行のコードで作業を実行できることがよくあります)。1 行目では、.NET Framework の System.Diagnostics.Process クラスを使用してメモ帳を起動します。さらに、メモ帳の呼び出し時に WaitForExit メソッドを追加しました。なぜでしょうか。WaitForExit メソッドは、PowerShell に対して、停止した状態を維持して、開始したプロセスが終了するまで待機するように指示するからです。起動したメモ帳のインスタンスが実行されている限り、PowerShell スクリプトでは何の処理も行いません。ただし、メモ帳が終了するとすぐに、スクリプトは次の行から処理を再開します。この場合、次の行では、単にメモ帳が終了したことをエコー バックしています。
また、次のようなコードを使用して、同じ処理を行うこともできます。
Notepad | Out-Null Write-Host "Notepad has terminated."
このコードは同様に動作しますが、あまり直感的に理解できるものではないので、.NET Framework を使用した方法を採用しました。それに、.NET Framework 自体や .NET Framework を使用してできることを多く学習するに越したことはありません。
プロセスを開始してから、しばらく待機した後にスクリプトを再開する方法は他にもあります。次のコードでは、Windows 電卓を起動し、10000 という値を WaitForExit メソッドに渡します。
[System.Diagnostics.Process]::Start("calc").WaitForExit(10000)
Write-Host "Calculator has ended, or 10 seconds have elapsed."
この作業の目的は何か、ですって。10000 は 10 秒 (10,000 ミリ秒) を表します。これは、電卓を起動し、最大 10 秒待機した後、残りのスクリプトの処理を続行するように指定しています。つまり、電卓を起動し、数秒後に終了した場合は、スクリプトの次の行が実行されます。でも、10 秒経過していても電卓が実行されている場合はどうなるのか疑問に思っている方がいらっしゃるようですね。その場合は、電卓側での処理は継続して実行され、とにかくスクリプトの次の行を進めます。
試してみれば、私たちの言いたいことがおわかりいただけると思います。
これでご質問の回答になっているとよいのですが、AD さん。そして、フェースブックの Scripting Guys グループに参加してもらう対価として、この回答が十分であったことを願っています。フェースブックのグループを作成することにしたそもそもの理由を知りたいと思っている方もいることでしょう。皆さんからは「TechNet グループ (参加メンバ 54 名) と MSDN グループ (参加メンバ 73 名) があるようですが、Scripting Guys グループを作成して、TechNet グループと MSDN グループの合計参加メンバよりも多くのメンバを獲得しようとしているわけじゃないですよね」というご指摘をいただきました。
Scripting Guys がそんなに浅はかで競争心旺盛だと本当に思っているのですか。ええ、おっしゃるとおり、私たちは浅はかで競争心旺盛です。確かに、私たちは、このグループが読者の皆さんとのやり取りを楽しく行う新たな方法になると考えています。まあでも、そのついでに TechNet と MSDN を少し打ち負かすことができたら、ちょっとしたご褒美になりそうですけどね。