How to enter multiple line of code in CMD from VBA?

六月ゝ 毕业季﹏ 提交于 2020-01-24 12:18:18

问题


I want to open a cmd.exe and then execute a few lines of code.

I searched the web for some examples.

Code I tried modifying:

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

I found How to write message to command window from VBA?

I tried multiple lines of coding, but the lines are executed in different command windows:

Sub CMD_VBA_Script()
    Shell "cmd.exe /K echo Hello World!", vbNormalFocus
    Shell "cmd.exe /K color 0a", vbNormalFocus
End Sub

I understand when I call the Shell two times, that it will execute two times.

My goal is to call the following script from VBA:

@echo off
    title Matrix
    color 0a
    mode 1000

    :a
    echo %random%%random%
    goto a

How can I execute multiple lines of code from VBA in command prompt?


回答1:


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"

So in short. You need to create a bat-file that you run. If you don't need the bat-file after it's done you can delete it with Kill




回答2:


You can write something like this -

Call Shell("cmd.exe /c "cd C:\Users\username\local\temp\" & " && temp.vbs" & " && mkdir newfolder")

This executes 3 lines of command:

  1. Change directory
  2. Execute a vbs file
  3. Make a new folder



回答3:


It looks like you want to execute a Command Prompt Batch file - batches are stateful, so simply executing each line separately is not going to have the same effect as executing the batch as a whole.

Two other alternative approaches involve faking batch execution by instructing an interactive instance of cmd.exe to execute commands as-they're-entered by some automated process: either sending window messages, or piping into the cmd process' stdin stream. I do not recommend either of these approaches because of their inherent flakiness (i.e. dependency on undocumented behavior)

So the best approach would be to just execute a batch file as it's intended - you would need to write the batch to a temporary file first, and then execute it:

Using the code from here: 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



回答4:


Use "cmd.exe /K" option, and '&' to connect multiple commands.

In C:\Users\%USERNAME%, create test.bat with two simple commands:

echo %PATH%
dir

Here is the complete sample:

Sub Demo_Multi_Commands()
    Cmd1 = "cd " & Environ("USERPROFILE")
    Cmd2 = "test.bat"
    Connector = " & "
    Commands = "cmd.exe /K " & Cmd1 & Connector & Cmd2 & Connector & "systeminfo"
    Debug.Print Commands
    pid = Shell(Commands, vbNormalFocus)
End Sub

Environment: Windows 10 Enterprise, VBA 7.1



来源:https://stackoverflow.com/questions/38539489/how-to-enter-multiple-line-of-code-in-cmd-from-vba

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!