WSHがお好きでしょ

WSHがお好きでしょ?(1)

こんにちは、なるーらぼです。今回から、だれがうれしいのかわからないノートをいくつか投稿していこうと思います。
お題はWSHです。Windows限定のお話になります。macOSにも似たような仕組みがありますので、そちらは別の機会で投稿できればいいな
と思っています。

WSH

みなさんはWSHをご存知でしょうか?そもそもなにをするものなのか、若い方はご存知ないかもしれませんね。ですから知らない方のほうが圧倒的に多いと思います。
Windows Scripting Hostの略称で、Windowsを管理するためにMicrosoftが開発した仕組みです。
詳しくはウィキペディアをご覧いただいたほうがよいかと思いますが、少しだけ能書きをさせていただきます。
もともとは比較的コンピュータ管理機能が弱いとされていた点を補強するため、それまで(現在も提供されていますが)コマンドプロンプトで行っていたよりもずっと強力に、かつ簡便にWindowsを操作することができるよう、プログラマブルな環境を用意したものが始まりです。現在はその役目をPowerShellに譲っているはずなのですが…そうはいかないのが現実ですね。

古(いにしえ)の仕組み

40代以上の方には、あまり良い印象がないかもしれません。
古くはメール添付型のマルウェアにも頻繁に使用されていたためです。
ものによってはサーバーサイドの技術にも発展しました(レガシーASPというやつです)。一時期は脆弱性の代名詞かのように言われていた時期もありました(注:WSHがというより、サーバープログラムを簡単につくれるため脆弱性をつくりこみやすかったのが実状だったと思います)。

実はWindows10になった現在においても、このWSHは動作します。
後方互換がWindowsに備えられているためで、一部の機能はまだPowerShellに移行していないため、いまでも実用的な技術なのです。

WSHをいじってみよう

WSHは大きく2種類の方法で利用することができます。
ひとつはVBScriptです。
名前から察することができるかと思いますが、VisualBasicやExcelマクロ(VBA)に非常によく似た文法で、どちらかをおおむね理解していれば
追加で学ぶことはほとんどありません。

もうひとつはJScriptです。
こちらも名前から察することができるかと思いますが、JavaScriptに非常によく似た文法です。ただ、フロントエンドをされている方にはちょっとつまづきそうなところがあります。
古いJavaScript仕様をベースにつくられているため、アロー関数や便利なメソッドが無かったりします。そのあたりさえ目をつぶれば、追加で学ぶことはほとんどありません。

ここではExcelマクロの経験がありそうな方のほうが多いかな?という予想でVBScriptを中心にやっていきますが、ときおりJScriptのほうも挟んでいきます。定番はテキストを表示なんですが、まずはVBScriptのほうだけいきます。そのあとでJScriptにしますね。メモ帳、もしくはお好きなテキストエディタで次のように書きます。

msgbox "こんにちは"

コメント 2020-02-28 173845

これを適当なフォルダに適当な名前で保存します。このとき、拡張子にだけ気を付けてください。「vbs」とします。
たとえばデスクトップに「hello.vbs」として保存します。
そうすると、怪しげなアイコンのファイルが作成されます。作成されたら、ダブルクリックしてみてください。
メッセージボックスで「こんにちは」が表示されます。

コメント 2020-02-28 173845-1

とても簡単ですね。

同じことをするのに、別の方法があります。

wscript.echo "こんにちは"

同じように保存してダブルクリックしてみてください。ほとんど同じ結果になったと思います。

コメント 2020-02-28 173845-2


JScriptの方にお待ちいただいたのは、こちらをご紹介してからでないと、と思ったからです。
JScriptの方は次のようにして、ファイルの拡張子は「js」にします。たとえば「hello.js」です。

WScript.Echo("こんにちは");

こんどは大文字小文字もキッチリ書いています。また、JavaScriptベースですので行末にセミコロン記号を書いています。
これで同じような結果になります。

すでにJavaScriptを書いたことがある方は、「alertでいいのでは」「console.logで出せないのか」と思われるかもしれません。
実はWSHではこれらalertもconsole.logも使うことができないのです。
alertは厳密にはWindowオブジェクトのメソッドで、WSHは画面を持ちません。そのため、Windowオブジェクトが存在しないのです。
また、console.logについてもコンソールはWindows独自の実装になっているためconsoleオブジェクトが存在しないのです。

おわりに

これで興味をもってくださる方がいらっしゃるかどうかわかりませんが、PowerShellだと見た目が生理的に受け付けないという場合や、マクロは使えるんだけど、Excelがないところではどうにもならないな、という方にも利用することができます。メモ帳が起動できればスクリプトプログラムをつくって動作させることができます。こういう方法もあるんだな、くらいに思って読んでいただけたらうれしいです。

次回はもう少しプログラムっぽいものを書いていきます。

この記事が気に入ったらサポートをしてみませんか?