2016-07-23 182 views
1

对于一个小项目,我想要一个宏来打开一个cmd.exe,然后执行几行代码。如何在VBA中输入CMD中的多行代码?

我在网上搜索了一些很好的例子,在那里找不到合适的解决方案。我试图修改代码如下:

strToPrint = "Hello World!" 
Shell "cmd.exe /K echo " & strToPrint, vbNormalFocus 

我发现这个代码上:How to write message to command window from VBA?

对于我的测试,我试图把它变成编码的多行,而是执行以下代码两条线后,在不同的命令窗口中执行,请参阅下面的代码:

Sub CMD_VBA_Script() 

Shell "cmd.exe /K echo Hello World!", vbNormalFocus 
Shell "cmd.exe /K color 0a", vbNormalFocus 

End Sub 

我明白,当我致电壳牌两次,它会执行两次,但我无法弄清楚如何把多行成一个命令窗口。

我的最终目标是从VBA调用下面的脚本:

@echo off 
title Matrix 
color 0a 
mode 1000 

:a 
echo %random%%random% 
goto a 

有人可以帮我到正确的方向如何从VBA执行代码多行到命令提示符?

问候, Dubblej

回答

3
MyFile = "C:\cmdcode.bat" 
fnum = FreeFile() 
Open MyFile For Output As #fnum 
Print #fnum, "@echo off" 
Print #fnum, "title Matrix" 
Print #fnum, "color 0a" 
Print #fnum, "mode 1000" 
Print #fnum, "" 
Print #fnum, ":a" 
Print #fnum, "echo %random%%random%" 
Print #fnum, "goto a" 
Close #fnum 


' Run bat-file: 
Shell MyFile, vbNormalFocus 


' optional, remove bat-file: 
Kill "C:\cmdcode.bat" 

因此,在短期。你需要创建一个你运行的bat文件。 如果在完成后不需要bat-file,则可以将其删除Kill

+0

谢谢你,它的伟大工程!我在Kill命令之前的代码中添加了'Application.Wait(Now +#12:00:03 AM#)',现在该文件被执行了3秒,然后它被杀死了。 – Dubblej

+0

没问题!当我想延迟代码时,我通常使用sleep()函数。 “睡眠(3000)”更容易写。 – Andreas

1

它看起来像要执行命令提示符批处理文件 - 批处理是有状态的,与整个执行批处理具有相同的效果。其他

两种备选方法涉及通过指示的cmd.exe交互式实例来执行命令伪造批处理执行如 - 它们输入的由一些自动化的过程:要么发送窗口消息,或管道进入cmd过程stdin流。我不建议,因为其固有的片状(即无证行为依赖)的这些方法的执行

所以最好的办法是只执行一个批处理文件,因为它的目的 - 你需要编写批处理一个临时文件,然后再执行:

从这里使用代码:https://support.microsoft.com/en-us/kb/195763

Dim tempFileName As String 
tempFileName = CreateTempFile("SomeBatch.cmd") 

WriteToBatchFile(tempFileName) ' you will have to write to the temp batch file yourself here 

Shell "cmd.exe /c """ & tempFileName & """", vbHide, True ' Run the batch file, then cmd.exe will terminate. The Shell function will block until cmd is closed 

Kill tempFile ' delete the temp batch file 
+0

谢谢你的解释,它现在使很多精神! – Dubblej