1. ホーム
  2. スクリプト・コラム
  3. DOS/BAT

bat, vbs, js ネイティブミックス (bat は vbs, js コードを実行可能)

2022-01-25 16:49:39

mshtaがfile://プロトコルをhtmlとしてパースすることがわかった(注:IUnknownとhappyxxdhahaが、ここは絶対パスでないと実行されないと教えてくれた)、心の中で100万匹の草競馬が走っていたので、答えはとてもシンプルだが4年間見逃した!?

基本的なフレームワーク

コピーコード コードは以下の通りです。

<! -- : bathome
@echo off
echo I'm Batch!
mshta "file://%~f0"
pause&exit
Use the comment tag to enclose the batch section, provided that the end of the comment tag does not appear in the batch section
-->
<script language=vbs>
Msgbox "I'm VBScript!"
</script>
<script>
alert("I'm JavaScript!")
</script>
<script>close()</script>

実際、file:// プロトコル名は省略することができ、インターフェイスを気にしないのであれば、コメントタグを完全に省略することも可能です。

コピーコード コードは以下の通りです。

@echo off
echo I'm Batch!
mshta "%~f0" <nul
pause&exit
The batch section should be followed by a string of >, with more < than appears before, for mshta to distinguish which are tags
And when the previous section appears to get redirected input from the file, it is recommended to add double quotes, e.g. <"script"
>>>>>>>>>>>>>>>>>>
<script language=vbs>
Msgbox "I'm VBScript!"
</script>
<script>
alert("I'm JavaScript!")
</script>
<script>close()</script>

gotoを使ったもう一つの書き方は、もう少し直感的に理解できるかもしれません。

コピーコード コードは以下の通りです。

@goto :bat
<script language=vbs>
Msgbox "I'm VBScript!"
</script>
<script>
alert("I'm JavaScript!")
</script>
<script>close()</script>
:bat
@echo off
echo I'm Batch!
mshta "%~f0" <nul
pause&exit

ここでのホストは mshta なので、WSH ホストのメソッドやプロパティはサポートされていないことに注意してください (いくつかのプロパティやメソッドの代替案については後述します)
しかし!mshtaの何がいけないのでしょうか!?
setTimeoutのネイティブサポート
iframe のネイティブサポート
domのネイティブサポート
javascript、vbscript のネイティブサポート アクセス可能なインタラクション
Ajaxのネイティブサポート
外部スクリプトの読み込みをネイティブでサポート
ウィンドウ内のファイルを選択するためのネイティブサポート
複雑なページ間インタラクションをネイティブでサポート
...
これだけ便利なものがあるのに、数える意味があるのだろうか?
バッチ処理の本場で初公開
------------------------------------------------------------------------------------------------------------
mshtaのホストに関する知識は、以下を参照してください。 https://msdn.microsoft.com/en-us/library/ms536495(VS.85).aspx
xiaopoさんのリテラシーのおかげで、コンソーシアムにはすでにmshtaプログラムのプロトタイプがあったことに気づきました。 http://cndos.fam.cx/forum/viewthread.php?tid=39655 ミラーサイトに戻り、さらなる進展があるかどうか見てみます。

コピーコード コードは以下の通りです。

:<! --
::::::::::::::::::::::::::::::::BAT::::::::::::::::::::::::::::::::

::::::::1.Execute the HTML code before the BAT code ::::::::
@echo off
call :e Starting mshta...
pause
::::::::1. Execute the BAT code before the HTML code ::::::::

::Execution of HTML code.
start mshta %0

::::::::2. Execute the BAT code after the HTML code ::::::::
call :e Mshta is executing HTML codes...
pause
::::::::2. BAT code after executing HTML code ::::::::

::Exit BAT.
exit/b

:::::::BAT function definition section :::::::
:e
echo %*
goto :eof
:::::::BAT function definition section :::::::

::::::::::::::::::::::::::::::::BAT::::::::::::::::::::::::::::::::
-->

<! -- This sentence is used to clear the first line of :-->
<script>document.body.innerText=""</script>

<! --------------------------HTML-------------------------->
<body onkeypress=window.close()>
<hr color=red>
<marquee><font color=green>HTML Codes</font></marquee>
<hr color=red>
<! --------------------------HTML-------------------------->

<! -- BAT & HTML {[email protected]/forum 2008-4-22}
Idea: when this file is executed as a BAT file, it exits before it reaches the HTML code section.
When this file is executed as an HTML file, the BAT code section is commented out and is not executed.
-->