JScriptのWSH部分のインテリセンスを有効にする

前の関連記事:バッチファイル:JScript部分をVisual Studio 2013でデバッグする


JScript(のWSHの部分)はWindowsの標準機能なのでVisual Studio Community 2013では当然デフォルトでインテリセンスが使えると思っていましたがそうではありませんでした。そもそもWindowsを操作できる部分はJScriptではなくてWSHというようです、、、というかJScriptでWSHを操作するという感じのようです、、、だからJScriptでWindowsが操作できるというのもあながち間違いでもないようですけど、、、

WSH用のインテリセンス機能をインストールすれば解決


Visual StudioでJavaScript(2)jQueryでもインテリセンスを有効にするのときみたいにNuGetパッケージをインストールすればできるのではないかとあれこれ格闘していましたが、JScriptのWindowsを操作する部分についてのインテリセンスを有効することができませんでした。

そもそもNuGetパッケージは単独ファイルにインストールできるわけでもなく、たくさん不要なファイルがくっついてくるプロジェクトテンプレートにしか追加できないようでとっても理解しにくいです。

ブラウザで動くのがJavaScriptでWindowsで動くのがJScriptだと思っていましたが、そういう訳でもなく、JScriptは.NETやIEでも使われておりWindowsを操作する部分は含まれおらず、Windowsを操作する部分はWSHというらしい、ということに気がつきました。

ということで「JScript インテリセンス」で検索するのはやめて「WSH インテリセンス」で検索してみると一発でほしい情報が手に入りました。

WSH-vsdoc.jsをインストール


WSH 用のインテリセンス機能を提供する WSH-vsdoc.js - 更新情報 : @jsakamoto

動画もありとてもわかりやすいです。
(でも私のエクスプローラーにはCopy as pathの項目がないですね。)

インテリセンス用のファイルはわざわざプロジェクトを作らなくてもファイル内にコメントアウトの形式で指定できることもわかりました。

WSH-vsdoc/WSH-vsdoc.js at master · jsakamoto/WSH-vsdoc


「Raw」を右クリック→「名前を付けてリンク先を保存」(Sleipnir4の場合)。

あとはJScriptファイル内でこのWSH-vsdoc.jsファイルの場所を指定して使うだけですので、Visual Studioのインストール先のC:\Program Files (x86)\Microsoft Visual Studio 12.0に保存することにしました。

あとはVisual Studioで開いたjsファイルに以下のコメントを追加するだけです。
/// <reference path="C:\Program Files (x86)\Microsoft Visual Studio 12.0\WSH-vsdoc.js"/>
バッチファイル:JScript部分をVisual Studio 2013でデバッグするで使ったバッチファイル内に埋め込んだJScript部分では有効になりませんでした。

でも拡張子をjsにすると、@if(0)==(0) ECHO OFFより前の行では動きましたがそれではあまり実用的ではありませんね。

いちいちjsファイル毎にreference pathを書かなくてもWSHのインテリセンスを有効にする


Visual StudioでJavaScript(2)jQueryでもインテリセンスを有効にすると同様に_references.jsファイルの設定をすれば各jsファイルにWSH-vsdoc.jsへのパスを書かなくても使えるようになります。

ただし使えるのは同じプロジェクト内のjsファイルのみです。

WSH JScript作成用のプロジェクトと割り切って使えばよいですね。

とりあえずプロジェクトを作らないと何もできないので新規プロジェクトを作成します。(今回はプロジェクトではなくWebサイトを作成していますが「プロジェクト」を「WebSite」と読み替えるだけで違いはありません。)

ファイル→新規作成→Webサイト、テンプレート→Visual Basic→ASP.NET 空のWebサイト。


ソリューションを右クリック→名前の変更、で「JScript」と改名してみましたがエクスプローラでみるとC:\Users\ユーザー名\Documents\Visual Studio 2013\Projects\WebSite9のままでした。

その中のslnファイルのみ名前が変わるようです。

ソリューションの中にあるWebSiteの改名方法はわかりませんでした。

Website以下に作ったファイルはプロジェクトファイルの中ではなく、C:\Users\ユーザー名\Documents\Visual Studio 2013\WebSites\WebSite9にあります。

WebSiteの名前は自動的に連番になっているようで、WebSitesフォルダの中身を手動で削除するとWebSite1というフォルダ名からまた始まりますがソリューションエクスプローラーでは「WebSite1(3)」などと括弧の数字がつきます。


「WebSite1(3)」と表示されていますが実フォルダ名は「WebSite1」になっています。

ファイル→新規作成→プロジェクト、テンプレート→Web→Visual Studio 2012、ASP.NET空のWebアプリケーション、とすればすべてProject以下のフォルダ内で扱えますが空のWebサイトよりもかなりたくさんのファイルとフォルダが生成されてしまいますのでWebサイトにしました。

WebSiteを右クリック→追加→新しいフォルダー。

「Scripts」というフォルダ名にします。

今度はこのScriptsフォルダを右クリック→追加→既存の項目。

WSH-vsdoc.jsを指定します。

これでScriptsフォルダにWSH-vsdoc.jsがコピーされます。

次に_references.jsを作成します。

Scriptsフォルダを右クリック→追加→新しい項目→JavaScriptファイル。

_references.jsという名前にします。
/// <reference path="WSH-vsdoc.js"/>
_references.jsにこのように入力し保存します。


あとはこのWebSiteに追加したjsファイルではWSHのインテリセンスが有効になります。

ソリューションエクスプラーラーでWebSiteを右クリック→追加→JavaScriptファイル。

これで作ったjsファイル内ではWSHのインテリセンスが有効になっています。


既存のjsファイルをソリューションフォルダに表示させるにはそのjsファイルをC:\Users\ユーザー名\Documents\Visual Studio 2013\WebSites\WebSite1フォルダに入れたあとにソリューションエクスプローラーでWebSite1を右クリック→フォルダーの更新、でできました。


Visual StudioからJScriptを起動できるように外部ツールを登録する


外部ツールにcscript.exeを登録してJScriptをVisual Studioの中から起動できるようにします。

ツール→外部ツール、「追加」。


コマンドはC:\Windows\System32\cscript.exe、引数は//nologoでロゴ行の出力を抑制し、//Xでデバッグモードで起動します。

引数の入力欄の右三角から「項目のパス」を選択すると現在開いているファイルのフルパスが入った$(ItemPath)が入力されます。

初期ディレクトリはソリューションディレクトリを選択しておきます。

コマンドウィンドウに出力された結果を確認できるように「終了時にウィンドウを閉じる」のチェックははずしておきます。

2015.4.4追記。C:\Windows\System32\cscript.exeを起動しているはずですがデバッグ中のソリューションエクスプローラーをみるとC:\Windows\SysWOW64\cscript.exeが使われていました。使用しているOSはWindodws7 64bitです。)


デバッグだけでなく、単に動作確認用のために//Xオプションをはずした「JScript起動」という項目も作っておきました。

あとでツールバーに登録しようと思っている項目は「上へ移動」ボタンを連打して一番上にしておくと選択が楽になります。

Visual Studioで作成したjsファイルはエンコーディングをシフトJISに変更が必要



WSHtest.jsというjsファイルを作って以下のコードを入力して保存します。
WScript.Echo("テスト")
このファイルを開いたままツール→「JScript起動」。

コマンドウィンドウに「テスト」と出力されるはずでしたがだめです。

外部ツールの登録画面に戻って「起動時に引数を入力」にチェックをいれて「JScript起動」で実行されるコマンドをコマンドウィンドウで実行するとエラーの原因がわかりました。

C:\Users\pq\Documents\Visual Studio 2013\WebSites\WebSite1\WSHtest.js(1, 1) Microsoft JScript コンパイル エラー: 文字が正しくありません。

jsファイルのエンコードの問題のようです。

メモ帳で確認してみるとWSHで動くjsファイルはANSIですが、Visual Studio 2013で作成したjsファイルはUTF-8になっています。

Visual Studioでjsファイルを保存するときにエンコーディングを変更する方法がありました(Visual Studioでファイルのエンコードを変更するには? - @IT)。

WSHtest.jsをVisual Studioで開いた状態で、ファイル→保存オプションの詳細設定。


「エンコード」を「日本語(シフトJIS)-コードページ932」、「行の終わり」を「Windows(CR LF)」に変更して「OK」します。

(2015.4.4追記。「行の終わり」は変更しなくても動きました。)

これだけではまだ変更されていないので、ファイル→WSHtest.jsの保存、で保存するとエンコーディングが変更になります。

この設定はjsファイルごとに必要でした。

テスト
続行するには何かキーを押してください . . .

これでツール→JScript起動、でWSHtest.jsの動作確認ができました。

jsファイルを保存しないと編集した部分は反映されませんでした。

あとはVisualStudio でJScriptのデバッグ: kaeruz.com 外部ツールから編集中のJScritptファイルを起動してデバッグしています。のときと同様にしてツール→「JScriptデバッグ起動」でデバッグできました。

よく使う外部ツールをツールバーに登録する


VisualStudio でJScriptのデバッグ: kaeruz.comで紹介されている通りです。


ツールバーの右端のオプションボタンをクリック→ボタンの追加または削除→カスタマイズ。


「コマンドの追加」。


「カテゴリ」:ツール。

「コマンド」からボタンに登録したい外部コマンドを選択して「OK」とするとボタンにそのコマンド名が表示されます。

この外部コマンドの番号は、ツール→外部コマンド、の登録パネルの表示順になっているようですので、ボタンに登録予定の外部コマンドは「上へ移動」ボタンで移動させておくとわかりやすいです。


「JScript起動」と「JScriptデバッグ起動」の二つをボタンに登録しようと思ったので、このように1番目と2番目にもっていきました。

するとそれぞれ「外部ツール1」、「外部ツール2」でツールバーに登録できました。


エクスプローラーでダブルクリックしてJScriptを実行するとwscript.exeが起動する


エクスプローラーでみるとjsファイルはデフォルトではMicrosoft Windows Based Script Host(C:\Windows\System32\wscript.exe)に関連付けられているはずです。


なのでWSHtest.jsをダブルクリックするとコマンドウィンドウではなく、このようなダイアログに出力されます。

関連付けをMicrosoft Console Based Script Host(C:\Windows\System32\cscript.exe)に変更してもダブルクリックする限りwscript.exeが起動するようで結果はかわりません。

WSHtest.jsを右クリックして、プログラムから開く→Microsoft Console Based Script Hostとすると一瞬コマンドウィンドウが見えますがすぐに閉じてしまいます。

DOSのpauseコマンドに相当するコマンドをWSHtest.jsの最後に入れて置けばよさそうなのですが、JScriptにはpauseに該当するコマンドはないようですのでちょっと工夫がいるようです。

参考にしたサイト


WSH 用のインテリセンス機能を提供する WSH-vsdoc.js - 更新情報 : @jsakamoto
JScriptで扱うWSH用のインテリセンスを作成してくれています。

VisualStudio でJScriptのデバッグ: kaeruz.com
外部ツールから編集中のJScritptファイルを起動してデバッグする方法。

Visual Studioでファイルのエンコードを変更するには? - @IT
WSH JScriptとして実行するにはシフトJISで保存しないといけません。

次の関連記事:「20150328_203141_3600_004」(年月日_時分秒_区間秒_区間番号)を「区間開始日時-区間終了日時」へ変換するJScript

PR

0 件のコメント:

コメントを投稿