在没有保存的vbs文件的情况下从cmd执行vbs命令

时间:2017-12-11 15:02:20

标签: node.js cmd vbscript

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

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

假设我们想在不保存vbs文件的情况下运行vbs命令Wscript.Echo Date(),我们该怎么做?

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

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

我认为Is it possible to embed and execute VBScript within a batch file without using a temporary file?没有回答这个问题,因为它涉及使用批处理文件。

在评论之后看起来如何使用mshta 我想要做的是从Node js脚本访问Windows索引。 Node Js允许我执行cmd行命令。 所以我可以直接执行这个命令 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索引的结果。这种方法的问题是只需要10秒就可以运行PowerShell。

要在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

更多更快。但是,使用nodejs运行vbs的唯一方法似乎是将代码转换为mshta接受的格式。

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

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);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<code id="vbs"></code>

我可以看到转换方法不是防错的,但在这种情况下看不出它出错的地方。

如果有人能够让上述mshta工作,我们将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

mshta vbscript:Close(MsgBox("Hello, World!"))

此方法不写入磁盘。可以在here上找到有关“ mshta.exe”的更多信息。

希望这会有所帮助。

-Gabe

相关问题