バッチファイル:JScript部分をVisual Studio 2013でデバッグする

前の関連記事:バッチファイル:JScriptを埋め込んでDOSコマンドと変数をやりとりする


Visual Studio Community 2013をインストールのVisual Studio Community 2013を使ってバッチファイルに埋め込んだJScript部分をデバッグします。

cscript.exe //XでVisual Studio Community 2013が起動する

@if(0)==(0) ECHO OFF
for /F "tokens=1 delims=." %%x in ('^(for /F "tokens=1,2,3 delims=:" %%p in ^('echo %DATE:/=%_%TIME: =0%'^) do echo %%p%%q%%r^)') do set DATE_TIME=%%x
for /F %%p in ('cscript.exe //X //nologo //E:JScript "%~f0"') do set DATE_TIME2=%%p
echo %DATE_TIME2%
@pause
GOTO :EOF
@end

var WshShell = WScript.CreateObject("WScript.Shell");
var WshSysEnv = WshShell.Environment("process");
var date_time=WshSysEnv("DATE_TIME");
WScript.Echo(date_time);
3行目でバッチファイル内のJScript部分を呼び出しているところに//Xオプションをつけるだけです。


「はい」を選択するとVisual Studio Community 2013が起動します。


ソリューションエクスプローラーをみるとC:\Windows\system32\cscript.exeが起動されていることがわかります。


Visual StudioでJavaScript(1)JavaScriptでもインテリセンスが有効と同様にしてツール→オプション、テクストエディター→JavaScriptで行番号をチェックしておくと行番号が表示されたのでJavaScriptとして認識されているようです。


JScriptの先頭部分からステップインで実行できます。

しかしデバッグを中止するとスクリプトファイルが閉じてしまうので、JavaScriptエディタを使っての編集ができません。

JScriptの最後のスクリプトが終わるとVisual Studioで開いていたバッチファイルが閉じて、コマンドウィンドウでDOSコマンドの続きが実行されます。


ソリューションエクスプローラーではcscriptが表示されていますが、バッチファイルが含まれるソリューションが作られるわけではないようです。


cscriptのソリューションを開いたまま再度//Xオプションがついたバッチファイルを実行すると、すでに開いているcscriptソリューションウィンドウに開くのか、新たなウィンドウで開くのかが選択できます。

これでデバッグはできるのですが、どうせならVisual Studioで開いたままデバッグしたいところです。

外部ツールに登録してVisual Studioでバッチファイルを開いたままデバッグする


まずはバッチファイルをVisual Studioで開いてみます。

Visual Studioのメニューでファイル→開く→ファイル、でバッチファイルを選択します。


単なるテキストファイルとしか認識されていないようで、シンタックスのハイライトもインテリセンスも働きません。


拡張子をjsに変更して保存しなおすとJavaScritpとして扱われました。

VisualStudio でJScriptのデバッグ: kaeruz.com

このページを参考にさせていただくと外部ツールからこのバッチファイルを起動すれば、Visual Studioで編集しながらデバッグできるようです。

ただしバッチファイルの中では先ほどと同様にしてcscript.exeは//Xオプションをつけてデバッグモードで起動するようにしておかないといけません。

JScriptファイルならC:\WINDOWS\system32\cscript.exe //Xで起動させればよいようですが、バッチファイルを起動させるプログラムというのがわかりませんでしたので、バッチファイルから起動させることにしました。
copy /Y %1 "%~dpn1.bat"
call "%~dpn1.bat"
引数のファイルの拡張子をbatに変更させて起動させるこのバッチプログラムcall_bat.batを作ってC:\Program Files (x86)\Microsoft Visual Studio 12.0に保存しました。

call_bat.batを編集中のjsファイルを引数として外部ツールで呼び出すようにします。

ツール→外部ツール。


「追加」をクリックしてタイトル「batファイル」、コマンド「C:\Program Files (x86)\Microsoft Visual Studio 12.0\call_bat.bat」、引数「$(ItemPath)」、初期ディレクトリ「$(TargetDir)」としました。

「起動時に引数を入力」をチェックしておくと、$(ItemPath)の中身が確認できます。

デバッグしたいバッチファイルをVisual Studioで開いたまま、ツール→batファイル、とします。


あとはエクスプローラで直接バッチファイルを起動したときと同じ結果になります。


不思議なことに、ファイル→新規作成→ファイル→JavaScriptファイル、で空のjsファイルを作ってそこに同じ内容を書き込んでも、この外部ツールでデバッグする方法はできませんでした。

Visual Studio側からみたら何かが違うのでしょう。
2015.3.29追記。jsファイルのエンコーディングの問題でした。JScriptのWSH部分のインテリセンスを有効にする参照。)

乗り掛けた船なので最後までやってみましたが、デバッグできるのはJScriptの部分だけですし、ここまで手間をかけるぐらいならもうバッチファイルは使わずに全部JScriptで書いてしまったほうがよいでしょう。

参考にしたサイト


レガシー環境のためのWindows Script Host(WSH)の解説 - Qiita
cscript.exe //XでVisual Studio Community 2013がデバッグモードで起動します。

2008-01-02 - プログラマとSEのあいだ
//D アクティブデバッグと//X デバッガでスクリプトを実行する、の違いを調べています。

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

次の関連記事:JScriptのWSH部分のインテリセンスを有効にする

PR

0 件のコメント:

コメントを投稿