从cmd执行vbs命令而不保存vbs文件

Tre*_*vor 2 vbscript cmd node.js

当命令未保存时,如何从 cmd 运行 vbs 命令?

例如,要运行尚未保存的powershellpowershell "get-childitem"命令,可以简单地使用,其中get-childitem是我们要使用的命令。我们不需要保存 powershell 文件来运行该命令。

假设我们想要运行 vbs 命令Wscript.Echo Date()而不先保存 vbs 文件,我们该怎么做呢?

我不想从 .bat 文件执行此操作。我真的希望在 node.js 脚本中嵌入 vbs 脚本。我意识到这并没有在问题标题中得到充分体现:-/我想使用 exec 并嵌入 vbs。重要的是除了 js 之外没有其他文件。

如果我可以从 cmd 控制台运行 vbs 命令而不使用任何文件,那么我可以从 node.js 运行该命令而不需要任何其他文件。

我不认为是否可以在不使用临时文件的情况下在批处理文件中嵌入并执行 VBScript?回答这个问题,因为它涉及使用批处理文件。

在评论之后,看起来要走的路是使用mshta 我想做的是从 Node js 脚本访问 Windows 索引。Node Js 允许我执行命令行命令。所以我可以直接执行这个命令, powershell "$connector = new-object system.data.oledb.oledbdataadapter -argument \"SELECT System.ItemPathDisplay FROM SYSTEMINDEX WHERE CONTAINS (System.FileName, '\"\"Google Chrome\"\" OR Cefclient.exe')\", \"provider=search.collatordso;extended properties='application=windows';\"; $dataset = new-object system.data.dataset; if ($connector.fill($dataset)) { $dataset.tables[0] }"它将返回 Windows 索引的结果。这种方法的问题是,仅仅让 powershell 运行起来就需要大约 10 秒的时间。

要在 vbs 中做同样的事情,可以使用

Set objConnection=CreateObject("ADODB.Connection")
Set objRecordSet=CreateObject("ADODB.Recordset")
objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
objRecordSet.Open "SELECT System.ItemPathDisplay FROM SYSTEMINDEX WHERE CONTAINS (System.FileName,'Chrome OR Cefclient.exe')",objConnection
objRecordSet.MoveFirst
Do Until objRecordset.EOF
Wscript.Echo objRecordset.Fields.Item("System.ItemPathDisplay")
objRecordset.MoveNext
Loop
Run Code Online (Sandbox Code Playgroud)

这要快得多。然而,我用nodejs运行vbs的唯一方法似乎是将代码转换为mshta可接受的格式。

我现在正在尝试将其转换为有效的mshta格式。为此,我正在使用此代码片段。

Set objConnection=CreateObject("ADODB.Connection")
Set objRecordSet=CreateObject("ADODB.Recordset")
objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
objRecordSet.Open "SELECT System.ItemPathDisplay FROM SYSTEMINDEX WHERE CONTAINS (System.FileName,'Chrome OR Cefclient.exe')",objConnection
objRecordSet.MoveFirst
Do Until objRecordset.EOF
Wscript.Echo objRecordset.Fields.Item("System.ItemPathDisplay")
objRecordset.MoveNext
Loop
Run Code Online (Sandbox Code Playgroud)
var vbs, before, after;
vbs = `Set objConnection=CreateObject("ADODB.Connection")
Set objRecordSet=CreateObject("ADODB.Recordset")
objConnection.Open "Provider=Search.CollatorDSO;Extended Properties='Application=Windows';"
objRecordSet.Open "SELECT System.ItemPathDisplay FROM SYSTEMINDEX WHERE CONTAINS (System.FileName,'Chrome OR Cefclient.exe')",objConnection
objRecordSet.MoveFirst
Do Until objRecordset.EOF
Wscript.Echo objRecordset.Fields.Item("System.ItemPathDisplay")
objRecordset.MoveNext
Loop`;
before = 'mshta "vbscript:window.close(execute("';
after = '"))"';

vbs = vbs.replace(/\n/g,':').
		replace(/"/g, '""').
		replace(/ /g, '"&chr(32)&"');
vbs = before + vbs + after;
$('#vbs').text(vbs);
Run Code Online (Sandbox Code Playgroud)

我可以看到转换方法并不是万无一失的,但在这种情况下看不出哪里出了问题。

如果有人能够使上述mshta工作正常工作,将不胜感激。

小智 6

很抱歉恢复这篇旧文章,但我找到了一种以纯批处理方式执行此操作的方法。它使用“mshta.exe”,这是默认安装在大多数 Windows 版本上的实用程序。这是一个例子:

mshta vbscript:Close(MsgBox("Hello, World!"))
Run Code Online (Sandbox Code Playgroud)

此方法不写入磁盘。有关“mshta.exe”的进一步阅读可以在此处找到。

希望这可以帮助。

-加布