批处理之家's Archiver

CrLf 发表于 2014-11-28 01:46

js/bat脚本混编新方案

[i=s] 本帖最后由 CrLf 于 2014-11-28 02:22 编辑 [/i]

该方案弥补了[url=http://bbs.bathome.net/redirect.php?goto=findpost&ptid=554&pid=47240&fromuid=30406]三种原有方案[/url]的缺点,不过仍然不支持含 */ 的批处理[code]1>1/* :
@echo off
echo 你好,我是 Batch
cscript -nologo -e:jscript %0
pause&exit
*/

WScript.Echo('你好,我是 JScript')[/code]和其他的混编方案一样,关键只在第一句[code]1>1/* :[/code]在 Batch 看来这句相当于:[code]: 1>1/*[/code]这是因为 cmd 在预处理的时候会先解析出句柄重定向(对同一句柄的多次定向以最后出现的为准),再统一后置
所以重定向被预处理到 : 后面,结果可想而知

在 JScript 看来这句相当于:[code]1>1/* ...*/[/code]1>1 的运行结果是个 Boolean 值,而 js 允许这种无意义的语句(其实对 eval 来说是有意义的)

CrLf 发表于 2014-11-28 02:00

[i=s] 本帖最后由 CrLf 于 2014-11-28 02:13 编辑 [/i]

经过测试,发现竟然还能简写...[code]1>/* :
@echo off
echo 你好,我是 Batch
cscript -nologo -e:jscript %0
pause&exit
*/

WScript.Echo('你好,我是 JScript')[/code]连自己都看不懂,JScript 引擎到底是怎么理解 1> 的,凭什么不报错
为了便于记忆理解,建议还是用顶楼方案吧...

PS:第一句改成 "0</* :"、"2>/* :"、"3>/* :"... "9>/* :" 都行,: 之后可以写任意内容,反正对于两个脚本而言 : 之后的部分都属于注释或标签

CrLf 发表于 2014-11-28 02:04

应该是js/bat混编的最优方案了,就是看起来非常怪异

Demon 发表于 2014-11-28 02:16

留名[color=Black][/color]

CrLf 发表于 2014-11-28 02:23

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=158292&ptid=33125]4#[/url] [i]Demon[/i] [/b]


    兄台还没睡,是加班吗?

Demon 发表于 2014-11-28 02:25

[quote]回复  Demon


    兄台还没睡,是加班吗?
[size=2][color=#999999]CrLf 发表于 2014-11-28 02:23[/color] [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=158293&ptid=33125][img]http://bbs.bathome.net/images/common/back.gif[/img][/url][/size][/quote]

打游戏

CrLf 发表于 2014-11-28 03:22

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=158294&ptid=33125]6#[/url] [i]Demon[/i] [/b]


    噢...看电影中

bailong360 发表于 2016-3-20 13:25

[b]回复 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=158290&ptid=33125]2#[/url] [i]CrLf[/i] [/b]
似乎是js把注释后面的内容接到>后面去了
以下代码报错[code]1>/* :
cscript -nologo -e:jscript "%~f0"
pause
exit
*/

var x =  new Array();[/code]

ai20110304 发表于 2020-2-10 13:17

好帖子。   学到一招

woetu 发表于 2020-7-15 08:53

非常感谢,受益匪浅

woetu 发表于 2020-7-15 14:55

还有一种[code]
@if (0)==(0) echo off
cscript -nologo -e:jscript %~s0
goto :EOF
@end

// ****************************  JavaScript  *******************************
[/code]

页: [1]

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.