gpt4 book ai didi

vbscript - 是否可以在不使用临时文件的情况下在批处理文件中嵌入和执行 VBScript?

转载 作者:行者123 更新时间:2023-12-02 18:15:58 30 4
gpt4 key购买 nike

长期以来,人们一直在批处理文件中嵌入和执行 VBScript。但是我看到的所有已发布的解决方案(在最初提出这个问题时)都涉及编写临时 VBS 文件。例如:Embed VBScript inside Windows batch file .

是否可以在不写入临时文件的情况下批量执行嵌入式 VBScript?

最佳答案

注意 - 跳转到 更新 2014-04-27 本答案底部的部分以获得最佳解决方案。

我曾经认为答案是否定的。但随后 DosTips 用户 Liviu 发现 <SUB>字符(Ctrl-Z、0x1A、十进制 26)嵌入批处理文件时会产生奇怪的效果。 If 的功能有点像行终止符,这样在 REM(或::remark hack)之后的批处理命令可以执行,如果它们前面是 Ctrl-Z。 http://www.dostips.com/forum/viewtopic.php?p=13160#p13160

这已在 XP Home Edition sp3、Vista Home Premium sp2 64 位和 Vista Enterprise sp2 32 位上得到确认。我假设它适用于其他 Windows 版本。

备注 - 下面的代码应该嵌入了 Ctrl-Z 字符。我发誓我曾经在用 IE8 浏览时在这个网站上看到过它们。但是他们似乎不知何故从这篇文章中丢失了,我无法再弄清楚如何发布它们。我已经用字符串 <SUB> 替换了这些字符

::<sub>echo This will execute in batch, but it will fail as vbs.
rem<SUB>echo This will execute in batch, and it is also a valid vbs comment
::'<SUB>echo This will execute in batch and it is also a valid vbs comment

这是成功的批处理/vbs 混合的关键。只要每个批处理命令前面都有 rem<SUB>::'<SUB> ,那么 vbs 引擎将看不到它,但批处理命令将运行。只要确保用 EXIT 终止批处理部分或 EXIT /B .然后脚本的其余部分可以是正常的 vbs。

如果需要,您甚至可以拥有批次标签。 :'Label既是有效的 vbs 注释又是有效的批处理标签。

这是一个简单的混合脚本。 (再次用 <SUB> 代替嵌入的 Ctrl-Z 字符)
::'<SUB>@cscript //nologo //e:vbscript "%~f0" & exit /b
WScript.Echo "Example of a hybrid VBS / batch file"

更新 2012-04-15

jeb 找到了一种避免笨拙的 CTRL-Z 的解决方案,但它在开始时打印出 ECHO OFF 并设置了一些无关变量。

我找到了一个没有 CTRL-Z 的解决方案,它消除了无关变量并且更容易理解。

通常特殊字符 & , | , < , >等在 REM 之后不起作用批量声明。但是特殊字符在 REM. 之后确实有效.我在 http://www.dostips.com/forum/viewtopic.php?p=3500#p3500 找到了这个信息块.测试表明 REM.仍然是有效的 VBS 注释。 编辑 - 根据 jeb 的评论,使用 REM^ 更安全(插入符号后有一个空格)。

所以这是一个使用 REM^ & 的微不足道的 VBS/批处理混合.唯一的缺点是它打印 REM &一开始,而 jeb 的解决方案打印 ECHO OFF .
rem^ &@cscript //nologo //e:vbscript "%~f0" & exit /b
WScript.Echo "Example of a hybrid VBS / batch file"

这是另一个简单的示例,它演示了多个批处理命令,包括对标记子例程的 CALL。
::' VBS/Batch Hybrid

::' --- Batch portion ---------
rem^ &@echo off
rem^ &call :'sub
rem^ &exit /b

:'sub
rem^ &echo begin batch
rem^ &cscript //nologo //e:vbscript "%~f0"
rem^ &echo end batch
rem^ &exit /b

'----- VBS portion ------------
wscript.echo "begin VBS"
wscript.echo "end VBS"
'wscript.quit(0)

我仍然喜欢 CTRL-Z 解决方案,因为它消除了所有无关的输出。

更新 2012-12-17

Tom Lavedas 在 Google Groups 上发布了一种从批处理脚本方便地运行动态 VBS 的方法: No file VBS hybrid scripting .该方法使用 mshta.exe(Microsoft HTML 应用程序主机)。

他最初的批处理解决方案依赖于外部小型 VBS.BAT 脚本在 FOR/F 内执行 VBS。我稍微修改了语法,以便可以方便地直接嵌入到任何给定的批处理脚本中。

它很慢,但非常方便。它仅限于执行单行 VBS。

VBS 是正常书写的,除了所有引号必须加倍:包含字符串的引号必须写为 "" , 字符串内部的引号必须写为 """" .通常,迷你脚本在 FOR/F 的 IN() 子句中执行。它可以直接执行,但前提是 stdout 已被重定向或管道传输。

只要安装了 IE,它就可以在 XP 以后的任何 Windows 操作系统上运行。
@echo off
setlocal
:: Define simple batch "macros" to implement VBS within batch
set "vbsBegin=mshta vbscript:Execute("createobject(""scripting.filesystemobject"")"
set "vbsBegin=%vbsBegin%.GetStandardStream(1).write("
set ^"vbsEnd=):close"^)"

:: Get yesterday's date
for /f %%Y in ('%vbsBegin% date-1 %vbsEnd%') do set Yesterday=%%Y
set Yesterday
pause
echo(

:: Get pi
for /f %%P in ('%vbsBegin% 4*atn(1) %vbsEnd%') do set PI=%%P
set PI
pause
echo(

set "var=name=value"
echo Before - %var%
:: Replace =
for /f "delims=" %%S in (
'%vbsBegin% replace(""%var%"",""="","": "") %vbsEnd%'
) do set "var=%%S"
echo After - %var%
pause
echo(

echo Extended ASCII:
for /l %%N in (0,1,255) do (

%= Get extended ASCII char, except can't work for 0x00, 0x0A. =%
%= Quotes are only needed for 0x0D =%
%= Enclosing string quote must be coded as "" =%
%= Internal string quote must be coded as """" =%
for /f delims^=^ eol^= %%C in (
'%vbsBegin% """"""""+chr(%%N)+"""""""" %vbsEnd%'
) do set "char.%%N=%%~C"

%= Display result =%
if defined char.%%N (
setlocal enableDelayedExpansion
echo( %%N: [ !char.%%N! ]
endlocal
) else echo( %%N: Doesn't work :(
)
pause
echo(

:: Executing the mini VBS script directly like the commented code below
:: will not work because mshta fails unless stdout has been redirected
:: or piped.
::
:: %vbsBegin% ""Hello world"" %vbsEnd%
::

:: But this works because output has been piped
%vbsBegin% ""Hello world"" %vbsEnd% | findstr "^"
pause

更新 2014-04-27

在 DosTips 上有一个很棒的纲要 js/vbs/html/hta hybrids and chimeras in cmd/bat .很多好东西来自不同的人。

在该线程中,DosTips 用户 Liviu 发现了一个 beautiful VBS/batch hybrid使用 WSF 的解决方案。
<!-- : Begin batch script
@echo off
cscript //nologo "%~f0?.wsf"
exit /b

----- Begin wsf script --->
<job><script language="VBScript">
WScript.Echo "VBScript output called by batch"
</script></job>

我认为这个解决方案很棒。批处理和 WSF 部分由漂亮的标题清楚地分开。批处理代码绝对正常,没有任何奇怪的语法。唯一的限制是批号不能包含 --> .

同样,WSF 中的 VBS 代码是绝对正常的。唯一的限制是 VBS 代码不能包含 </script> .

唯一的风险是未记录使用 "%~f0?.wsf"作为要加载的脚本。解析器以某种方式正确地找到并加载正在运行的 .BAT 脚本 "%~f0" ,以及 ?.wsf后缀神秘地指示 CSCRIPT 将脚本解释为 WSF。希望微软永远不会禁用该“功能”。

由于该解决方案使用 WSF,批处理脚本可以包含任意数量的独立 VBS、JScript 或其他可以选择性调用的作业。每个工作甚至可以使用多种语言。
<!-- : Begin batch script
@echo off
echo batch output
cscript //nologo "%~f0?.wsf" //job:JS
cscript //nologo "%~f0?.wsf" //job:VBS
exit /b

----- Begin wsf script --->
<package>
<job id="JS">
<script language="VBScript">
sub vbsEcho()
WScript.Echo "VBScript output called by JScript called by batch"
end sub
</script>
<script language="JScript">
WScript.Echo("JScript output called by batch");
vbsEcho();
</script>
</job>
<job id="VBS">
<script language="JScript">
function jsEcho() {
WScript.Echo("JScript output called by VBScript called by batch");
}
</script>
<script language="VBScript">
WScript.Echo "VBScript output called by batch"
call jsEcho
</script>
</job>
</package>

关于vbscript - 是否可以在不使用临时文件的情况下在批处理文件中嵌入和执行 VBScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9074476/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com