如果未保存命令,如何从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
工作,我们将不胜感激。
答案 0 :(得分:0)
很抱歉要恢复此旧帖子,但是我找到了一种纯批处理方式。它使用默认安装在大多数Windows版本上的实用程序“ mshta.exe”。这是一个示例:
mshta vbscript:Close(MsgBox("Hello, World!"))
此方法不写入磁盘。可以在here上找到有关“ mshta.exe”的更多信息。
希望这会有所帮助。
-Gabe