猿问

可以在批处理文件中嵌入和执行VBScript而不使用临时文件吗?

可以在批处理文件中嵌入和执行VBScript而不使用临时文件吗?

长期以来,人们一直在批处理文件中嵌入和执行VBScript。但是我看到的所有公开的解决方案(在最初提出这个问题时)包括编写临时VBS文件。例如:在Windows批处理文件中嵌入VBScript.

是否可以在批处理中执行嵌入式VBScript而不编写临时文件?


慕莱坞森
浏览 917回答 3
3回答

饮歌长啸

我以前认为答案是否定的。但是DosTips用户Liviu发现<SUB>字符(Ctrl-Z,0x1A,十进制26)在批处理文件中嵌入时会产生双值效应。如果功能有点像行结束符,那么在REM之后的批处理命令(或:cripthack)如果前面有Ctrl-Z,就有可能执行这些命令。http:/www.dostips.com/Forum/viewtopic.php?P=13160#p 13160这一点已经在XP家庭版SP3,Vista家庭高级sp 2 64位和Vista Enterprisesp2 32位上得到确认。我假设它适用于其他Windows版本。注&nbsp;-&nbsp;下面的代码应该嵌入了Ctrl-Z字符。我发誓,当我看到IE8的时候,我经常在这个网站上看到他们。但是他们似乎已经从这个帖子中消失了,我想不出怎么再发了。我用字符串替换了字符<SUB>::<sub>echo&nbsp;This&nbsp;will&nbsp;execute&nbsp;in&nbsp;batch,&nbsp;but&nbsp;it&nbsp;will&nbsp;fail&nbsp;as&nbsp;vbs.rem<SUB>echo&nbsp;This&nbsp;will&nbsp;execute&nbsp;in&nbsp;batch,&nbsp;and&nbsp;it&nbsp;is&nbsp;also&nbsp;a&nbsp;valid&nbsp;vbs&nbsp;comment::'<SUB>echo&nbsp;This&nbsp;will&nbsp;execute&nbsp;in&nbsp;batch&nbsp;and&nbsp;it&nbsp;is&nbsp;also&nbsp;a&nbsp;valid&nbsp;vbs&nbsp;comment这是一个成功的批/VBS混合的关键。只要每个批处理命令前面有rem<SUB>或::'<SUB>,则VBS引擎将看不到它,但批处理命令将运行。只需确保将批处理部分终止为EXIT或EXIT /B..然后脚本的其余部分可以是普通的VBS。如果需要的话,你甚至可以有一个批次标签。:'Label既是一个有效的VBS注释,也是一个有效的批处理标签。下面是一个简单的混合脚本。(再次与<SUB>取代嵌入式Ctrl-Z字符)::'<SUB>@cscript&nbsp;//nologo&nbsp;//e:vbscript&nbsp;"%~f0"&nbsp;&&nbsp;exit&nbsp;/bWScript.Echo&nbsp;"Example&nbsp;of&nbsp;a&nbsp;hybrid&nbsp;VBS&nbsp;/&nbsp;batch&nbsp;file"更新2012-04-15Jeb找到了一种解决方案,可以避免尴尬的CTRL-Z,但它在开始时输出回波,并设置一些无关的变量。我找到了一个没有CTRL-Z的解决方案,它消除了无关变量,而且更容易理解。正常情况下,特殊人物&,&nbsp;|,&nbsp;<,&nbsp;>等不起作用之后REM语句批处理。但是这些特殊的角色REM...我在http:/www.dostips.com/Forum/viewtopic.php?P=3500#P 3500..测试表明REM.仍然是VBS的有效评论。编辑&nbsp;-根据Jeb的评论,使用起来更安全REM^(插入符号后面有一个空格)。下面是一个简单的VBS/批处理混合使用REM^ &..唯一的缺点是指纹REM &一开始,杰布的解决方案ECHO OFF.rem^&nbsp;&@cscript&nbsp;//nologo&nbsp;//e:vbscript&nbsp;"%~f0"&nbsp;&&nbsp;exit&nbsp;/bWScript.Echo&nbsp;"Example&nbsp;of&nbsp;a&nbsp;hybrid&nbsp;VBS&nbsp;/&nbsp;batch&nbsp;file"下面是另一个简单的示例,它演示了多个批处理命令,包括对标记子例程的调用。::'&nbsp;VBS/Batch&nbsp;Hybrid::'&nbsp;---&nbsp;Batch&nbsp;portion&nbsp;---------rem^&nbsp;&@echo&nbsp;offrem^&nbsp;&call&nbsp;:'subrem^&nbsp;&exit&nbsp;/b:'subrem^&nbsp;&echo&nbsp;begin&nbsp;batchrem^&nbsp;&cscript&nbsp;//nologo&nbsp;//e:vbscript&nbsp;"%~f0"rem^&nbsp;&echo&nbsp;end&nbsp;batchrem^&nbsp;&exit&nbsp;/b'-----&nbsp;VBS&nbsp;portion&nbsp;------------wscript.echo&nbsp;"begin&nbsp;VBS"wscript.echo&nbsp;"end&nbsp;VBS"'wscript.quit(0)我仍然喜欢CTRL-Z解决方案,因为它消除了所有无关的输出。更新2012-12-17TomLavedas发布了一种方法,可以方便地从GoogleGroups的批处理脚本中运行动态VBS:无文件VBS混合脚本..该方法使用mshta.exe(MicrosoftHTML应用程序主机)。他最初的批处理解决方案依赖于一个外部的小型VBS.BAT脚本来执行一个for/F中的VBS。我稍微修改了语法,以便于直接嵌入到任何给定的批处理脚本中。它很慢,但很方便。它仅限于执行VBS的一行。VBS是正常编写的,但所有引号必须加倍:包含字符串的引号必须写为"",并且字符串内部的引号必须写为""""..通常,Mini脚本是在for/F的IN()子句中执行的,它可以直接执行,但只有在stdout被重定向或管道化时才能执行。只要安装了IE,它就可以从XP开始在任何Windows操作系统上工作。@echo&nbsp;off setlocal::&nbsp;Define&nbsp;simple&nbsp;batch&nbsp;"macros"&nbsp;to&nbsp;implement&nbsp;VBS&nbsp;within&nbsp;batchset&nbsp;"vbsBegin=mshta&nbsp;vbscript:Execute("createobject(""scripting.filesystemobject"")" set&nbsp;"vbsBegin=%vbsBegin%.GetStandardStream(1).write(" set&nbsp;^"vbsEnd=):close"^)"::&nbsp;Get&nbsp;yesterday's&nbsp;datefor&nbsp;/f&nbsp;%%Y&nbsp;in&nbsp;('%vbsBegin%&nbsp;date-1&nbsp;%vbsEnd%')&nbsp;do&nbsp;set&nbsp;Yesterday=%%Yset&nbsp;Yesterday pause echo(::&nbsp;Get&nbsp;pifor&nbsp;/f&nbsp;%%P&nbsp;in&nbsp;('%vbsBegin%&nbsp;4*atn(1)&nbsp;%vbsEnd%')&nbsp;do&nbsp;set&nbsp;PI=%%Pset&nbsp;PI pause echo(set&nbsp;"var=name=value"echo&nbsp;Before&nbsp;-&nbsp;%var%::&nbsp;Replace&nbsp;=for&nbsp;/f&nbsp;"delims="&nbsp;%%S&nbsp;in&nbsp;( &nbsp;&nbsp;'%vbsBegin%&nbsp;replace(""%var%"",""="","":&nbsp;"")&nbsp;%vbsEnd%')&nbsp;do&nbsp;set&nbsp;"var=%%S"echo&nbsp;After&nbsp;&nbsp;-&nbsp;%var%pause echo(echo&nbsp;Extended&nbsp;ASCII:for&nbsp;/l&nbsp;%%N&nbsp;in&nbsp;(0,1,255)&nbsp;do&nbsp;( &nbsp;&nbsp;%=&nbsp;&nbsp;Get&nbsp;extended&nbsp;ASCII&nbsp;char,&nbsp;except&nbsp;can't&nbsp;work&nbsp;for&nbsp;0x00,&nbsp;0x0A.&nbsp;&nbsp;=% &nbsp;&nbsp;%=&nbsp;&nbsp;Quotes&nbsp;are&nbsp;only&nbsp;needed&nbsp;for&nbsp;0x0D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=% &nbsp;&nbsp;%=&nbsp;&nbsp;&nbsp;&nbsp;Enclosing&nbsp;string&nbsp;quote&nbsp;must&nbsp;be&nbsp;coded&nbsp;as&nbsp;""&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=% &nbsp;&nbsp;%=&nbsp;&nbsp;&nbsp;&nbsp;Internal&nbsp;string&nbsp;quote&nbsp;must&nbsp;be&nbsp;coded&nbsp;as&nbsp;""""&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=% &nbsp;&nbsp;for&nbsp;/f&nbsp;delims^=^&nbsp;eol^=&nbsp;%%C&nbsp;in&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;'%vbsBegin%&nbsp;""""""""+chr(%%N)+""""""""&nbsp;%vbsEnd%' &nbsp;&nbsp;)&nbsp;do&nbsp;set&nbsp;"char.%%N=%%~C" &nbsp;&nbsp;%=&nbsp;&nbsp;Display&nbsp;result&nbsp;&nbsp;=% &nbsp;&nbsp;if&nbsp;defined&nbsp;char.%%N&nbsp;( &nbsp;&nbsp;&nbsp;&nbsp;setlocal&nbsp;enableDelayedExpansion &nbsp;&nbsp;&nbsp;&nbsp;echo(&nbsp;&nbsp;&nbsp;%%N:&nbsp;[&nbsp;!char.%%N!&nbsp;] &nbsp;&nbsp;&nbsp;&nbsp;endlocal&nbsp;&nbsp;)&nbsp;else&nbsp;echo(&nbsp;&nbsp;&nbsp;%%N:&nbsp;Doesn't&nbsp;work&nbsp;:()pause echo(::&nbsp;Executing&nbsp;the&nbsp;mini&nbsp;VBS&nbsp;script&nbsp;directly&nbsp;like&nbsp;the&nbsp;commented&nbsp;code&nbsp;below&nbsp; ::&nbsp;will&nbsp;not&nbsp;work&nbsp;because&nbsp;mshta&nbsp;fails&nbsp;unless&nbsp;stdout&nbsp;has&nbsp;been&nbsp;redirected::&nbsp;or&nbsp;piped.::::&nbsp;&nbsp;&nbsp;&nbsp;%vbsBegin%&nbsp;""Hello&nbsp;world""&nbsp;%vbsEnd%::::&nbsp;But&nbsp;this&nbsp;works&nbsp;because&nbsp;output&nbsp;has&nbsp;been&nbsp;piped%vbsBegin%&nbsp;""Hello&nbsp;world""&nbsp;%vbsEnd%&nbsp;|&nbsp;findstr&nbsp;"^"pause2014-04-27在DosTips有一个伟大的汇编JS/VBS/html/HTA杂交和cmd/bat中的嵌合体..很多来自不同的人的好东西。在这个线程中,DosTips用户liviu发现了一个漂亮的VBS/批处理混合使用WSF的解决方案。<!--&nbsp;:&nbsp;Begin&nbsp;batch&nbsp;script@echo&nbsp;off cscript&nbsp;//nologo&nbsp;"%~f0?.wsf"exit&nbsp;/b-----&nbsp;Begin&nbsp;wsf&nbsp;script&nbsp;---><job><script&nbsp;language="VBScript"> &nbsp;&nbsp;WScript.Echo&nbsp;"VBScript&nbsp;output&nbsp;called&nbsp;by&nbsp;batch"</script></job>我觉得这个解决方案太棒了。批处理部分和WSF部分显然由很好的头分隔。批处理代码是绝对正常的,没有任何奇怪的语法。唯一的限制是批处理代码不能包含-->.类似地,WSF中的VBS代码是绝对正常的。唯一的限制是vbs代码不能包含</script>.唯一的风险是非法使用"%~f0?.wsf"作为要加载的脚本。解析器以某种方式正确地找到并加载正在运行的.bat脚本"%~f0",以及?.wsf后缀神秘地指示CSCRIPT将脚本解释为WSF。希望微软永远不会禁用这个“功能”。由于解决方案使用WSF,批处理脚本可以包含任意数量的独立VBS、JScript或其他可以选择性调用的作业。每个作业甚至可以使用多种语言。<!--&nbsp;:&nbsp;Begin&nbsp;batch&nbsp;script@echo&nbsp;off echo&nbsp;batch&nbsp;output cscript&nbsp;//nologo&nbsp;"%~f0?.wsf"&nbsp;//job:JS cscript&nbsp;//nologo&nbsp;"%~f0?.wsf"&nbsp;//job:VBSexit&nbsp;/b-----&nbsp;Begin&nbsp;wsf&nbsp;script&nbsp;---><package> &nbsp;&nbsp;<job&nbsp;id="JS"> &nbsp;&nbsp;&nbsp;&nbsp;<script&nbsp;language="VBScript"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sub&nbsp;vbsEcho() &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Echo&nbsp;"VBScript&nbsp;output&nbsp;called&nbsp;by&nbsp;JScript&nbsp;called&nbsp;by&nbsp;batch" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;sub &nbsp;&nbsp;&nbsp;&nbsp;</script> &nbsp;&nbsp;&nbsp;&nbsp;<script&nbsp;language="JScript"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Echo("JScript&nbsp;output&nbsp;called&nbsp;by&nbsp;batch"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vbsEcho(); &nbsp;&nbsp;&nbsp;&nbsp;</script> &nbsp;&nbsp;</job> &nbsp;&nbsp;<job&nbsp;id="VBS"> &nbsp;&nbsp;&nbsp;&nbsp;<script&nbsp;language="JScript"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function&nbsp;jsEcho()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Echo("JScript&nbsp;output&nbsp;called&nbsp;by&nbsp;VBScript&nbsp;called&nbsp;by&nbsp;batch"); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;</script> &nbsp;&nbsp;&nbsp;&nbsp;<script&nbsp;language="VBScript"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WScript.Echo&nbsp;"VBScript&nbsp;output&nbsp;called&nbsp;by&nbsp;batch" &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;call&nbsp;jsEcho&nbsp;&nbsp;&nbsp;&nbsp;</script> &nbsp;&nbsp;</job></package>
随时随地看视频慕课网APP
我要回答