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

17 浏览
0 Comments

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

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

有没有可能在批处理中执行嵌入的VBScript而无需编写临时文件?

0
0 Comments

在这篇文章中,我们将讨论如何在批处理文件中嵌入和执行VBScript,而无需使用临时文件。这个问题的出现是因为批处理文件中的命令通常无法直接执行VBScript代码。然而,通过在每个批处理命令之前添加“REM”或“::'”,可以绕过VBScript引擎对这些命令的识别。这样一来,批处理命令就可以在批处理文件中执行,而不会被VBScript引擎执行。需要注意的是,在批处理部分结束时,需要添加一个“EXIT”或“EXIT /B”命令来终止批处理部分的执行。然后,剩余的脚本可以是正常的VBScript代码。

另外,还有其他一些方法可以在批处理文件中嵌入和执行VBScript代码。例如,可以使用“REM^&”或“REM^.”来绕过批处理中特殊字符的限制,以实现VBScript代码的执行。此外,还可以使用mshta.exe工具来运行动态的VBScript代码,该工具可以将VBScript代码嵌入到批处理脚本中。

总结起来,我们可以通过在批处理命令之前添加特定的注释来嵌入和执行VBScript代码,或者使用其他工具来实现在批处理文件中执行VBScript代码的功能。这些方法可以使我们更灵活地处理批处理文件,并实现更复杂的脚本功能。

0
0 Comments

在没有使用临时文件的情况下嵌入和执行VBScript的方法

问题的出现原因:

在批处理文件中嵌入和执行VBScript的问题是,通常需要创建一个临时文件来存储VBScript代码。这会增加额外的步骤和复杂性,并且可能会导致文件管理方面的问题。因此,人们想要找到一种在不使用临时文件的情况下嵌入和执行VBScript的方法。

解决方法:

解决这个问题的一个简单方法是使用“备用数据流”(Alternate Data Stream,ADS)来存储VBScript代码。简单来说,ADS是在同一个文件中存储其他数据的“另一个位置”,也就是说,一个文件由其原始数据加上任意数量的附加ADS组成。每个ADS通过冒号将其名称与原始文件名分隔开来。例如:

test.bat <- 一个名为“test.bat”的文件

test.bat:script_.vbs <- 文件“test.bat”的一个名为“script_.vbs”的ADS

ADS的更详细和技术性描述可以在网上找到,但现在重要的是提到这个特性仅适用于NTFS磁盘。下面看看如何使用这个特性来解决这个特定的问题。

首先,以通常的方式创建原始批处理文件。也可以使用以下命令从命令行启动notepad.exe:

notepad test.bat

对于我的示例,我在test.bat中插入了以下行:

off

setlocal

For /f "delims=" %%i in ('Cscript //nologo "test.bat:script_.vbs" "Select a folder"') do Set "folder=%%i"

echo Result: "%folder%"

注意VBScript脚本的名称。在保存test.bat并关闭Notepad后,使用Notepad创建VBScript脚本,因此在命令行中输入以下命令:

notepad test.bat:script_.vbs

然后以通常的方式创建脚本:

Dim objFolder, objShell

Set objShell = CreateObject("Shell.Application")

Set objFolder = objShell.BrowseForFolder(0, "Select a folder.", &H4000, 0)

If Not (objFolder Is Nothing) Then

wscript.echo objFolder.Self.path

Else

wscript.echo 0

End If

保存此文件并运行test.bat。它起作用了!你可以通过dir命令中的/R开关查看test.bat文件的ADS。你可以在这个帖子中阅读更详细的解释及其限制。

现在,我发现这非常有趣。出于某种原因,也有点隐秘。虽然我想不到立即使用的方法,但我打算将其保存在某个地方以备将来使用。

仅适用于NTFS!是的。我已经在第二段的第一句话中指出了这一点:“你可以在网上找到更详细和技术性的ADS描述,但现在重要的是提到这个特性仅适用于NTFS磁盘”。

糟糕!我没有看到,对不起!不,你错了。这里只有一个文件,文件扩展名为.bat!

0
0 Comments

编辑:我之前对于VBScript的回答是错误的,现在我换一种尝试...

使用CTRL-Z是个好主意,但我不喜欢在批处理文件中使用控制字符,因为复制和粘贴这些字符会有问题。

这取决于你的浏览器,你的编辑器,你的...

你也可以使用常规字符和“常规”代码来创建VBScript/批处理混合体。

:'VBS/批处理混合体

:

:

:'下一行只对VBScript可见 ^

a=1_

<1' echo off <nul

set n=nothing' & goto :'batchCode & REM 跳转到批处理代码

'VBScript部分

wscript.echo "VB-Start"

wscript.echo "vb-End"

wscript.quit(0)

'批处理部分

:'batchCode

set n=n'& echo Batch-Start

set n=n'& echo two

set n=n'& echo Batch-End

set n=n'& cscript /nologo /E:vbscript vbTest.bat

这个技巧是在每一行批处理代码前面加上set n=n'&,这在两种语言中都是合法的,但是VBScript会忽略掉行的其余部分,只有批处理会执行行的其余部分。

另一种变体是:'remark ^,这是两种语言的注释,但对于批处理来说,它也会注释掉下一行,因为它是多行字符。

VBScript看到的是a=1<1,行的其余部分是注释。

批处理只看到<1' echo off

唯一剩下的问题是你可以看到第一个echo off,因为在重定向后使用@在批处理中是行不通的。

对于JScript存在一个更简单的解决方案混合脚本

我不明白这对VBscript有什么帮助。Jscript和VBscript具有完全不同的语法。真正的问题是VBscript缺少多行注释。如果脚本中任何地方暴露了单个批处理行,VBscript就无法编译。

你是对的,我没有充分考虑到VBScript的问题,我会改变我的回答来提供一个有用的变体。

+1 聪明。在ECHO OFF后添加&SETLOCAL可能会有所改进。我还会把n=nothing移到第二行,并把批处理移到顶部加上exit /b,但这只是外观上的改变。我仍然更喜欢CTRL-Z的解决方案,因为它支持OFF,并且不会设置任何多余的变量。难看的控制字符与不需要的ECHO OFF输出 - 我们每个人都必须选择自己的毒药:-)

0