技術とか戦略とか

IT技術者が技術や戦略について書くブログです。

WindowsバッチでJavaScriptの関数の結果を標準出力で受け取る

表題の通りですが、WindowsバッチでJavaScriptの関数の結果を標準出力で受け取ることができます。
標準出力なので、パイプやリダイレクトも可能です。
 
JavaScriptで書かれた処理を自動実行したい場合や、JavaScriptのちょっとした仕様調査を行いたい場合等に活用できると思います。
 
mshta.exeをWindowsバッチから呼び出す方法もあるのですが、mshta.exeはセキュリティ的にあまり良くない実行ファイルでありセキュリティソフトにブロックされることがあるので、WindowsPowerShellWindowsバッチから呼び出す方法を紹介します。
32bitマシンと64bitマシンで微妙に呼び出し方が異なる用なのですが、現在では64bitマシンが主流のため、64bitマシンを前提とします。
 
ここから先はサンプルコードを見た方が早いと思うので、サンプルコードを紹介します。
Windowsバッチ(~.bat)は1つのコマンドが長くなるので「^(キャレット)」でコマンドを改行しています。
 
【サンプルコード】
・js_test.ps1
# JavaScriptを実行するオブジェクトを作成
$sc = New-Object -ComObject MSScriptControl.ScriptControl
$sc.Language = "Javascript"

# 引数1つの関数「func」を登録
$func = "
    function func(arg1){
        var hello = 'Hello\r\n';
        return hello+arg1;
    }
"
$sc.Eval($func)

# 登録された関数を実行
# 戻り値が標準出力される
$sc.CodeObject.func('Code')
 
・js_test.bat
@echo off

rem 64bitマシンの場合、32bit版のpowershellを明示的に指定する必要がある
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe ^
-ExecutionPolicy RemoteSigned -File .\js_test.ps1
pause
 
・js_test_pipe.bat
@echo off

rem 標準出力なのでパイプに渡すこともできる
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe ^
-ExecutionPolicy RemoteSigned -File .\js_test.ps1 | sort
pause
 
・js_test_redirect.bat
@echo off

rem 標準出力なのでリダイレクトでファイル出力もできる
del .\js_test.txt
C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe ^
-ExecutionPolicy RemoteSigned -File .\js_test.ps1 > .\js_test.txt
dir .\js_test.txt
type .\js_test.txt
pause
 
【実行結果】
・js_test.bat
Hello
Code
続行するには何かキーを押してください . . .
 
・js_test_pipe.bat
Code
Hello
続行するには何かキーを押してください . . .
 
・js_test_redirect.bat
C:\tmp\js_test.txt が見つかりませんでした。
 ドライブ C のボリューム ラベルは  です
 ボリューム シリアル番号は  です

 C:\tmp のディレクト

2020/03/15  16:33                13 js_test.txt
               1 個のファイル                  13 バイト
               0 個のディレクトリ  24,925,503,488 バイトの空き領域
Hello
Code
続行するには何かキーを押してください . . .