【问题标题】:How to enter multiple line of code in CMD from VBA?如何从 VBA 在 CMD 中输入多行代码?
【发布时间】:2019-11-24 16:33:09
【问题描述】:

我想打开一个cmd.exe,然后执行几行代码。

我在网上搜索了一些例子。

我尝试修改的代码:

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

我知道当我调用 Shell 两次时,它会执行两次。

我的目标是从 VBA 调用以下脚本:

@echo off
    title Matrix
    color 0a
    mode 1000

    :a
    echo %random%%random%
    goto a

如何在命令提示符下从 VBA 执行多行代码?

【问题讨论】:

    标签: excel vba cmd


    【解决方案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"
    

    简而言之。您需要创建一个运行的 bat 文件。 如果完成后不需要 bat 文件,可以使用 Kill 删除它

    【讨论】:

    • 谢谢,效果很好!我在 Kill 命令之前的代码中添加了“Application.Wait (Now + #12:00:03 AM#)”,现在文件执行了 3 秒然后被杀死。
    • 没问题!当我想延迟代码时,我通常使用 sleep() 函数。 Sleep(3000) 写起来容易一点。
    【解决方案2】:

    你可以这样写 -

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

    这会执行 3 行命令:

    1. 更改目录
    2. 执行一个 vbs 文件
    3. 新建文件夹

    【讨论】:

      【解决方案3】:

      您似乎想要执行命令提示符批处理文件 - 批处理是有状态的,因此简单地单独执行每一行不会与作为一个整体执行批处理具有相同的效果。

      另外两种替代方法涉及通过指示cmd.exe 的交互式实例在某些自动化进程重新输入命令时执行命令来伪造批处理执行:要么发送窗口消息,要么通过管道进入cmd 进程'@ 987654324@ 流。我不推荐这两种方法,因为它们固有的脆弱性(即依赖于未记录的行为)

      因此,最好的方法是按预期执行批处理文件 - 您需要先将批处理写入临时文件,然后再执行:

      使用此处的代码: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】:

      使用“cmd.exe /K”选项和'&'连接多个命令。

      在 C:\Users\%USERNAME% 中,使用两个简单的命令创建 test.bat:

      echo %PATH%
      dir
      

      这是完整的示例:

      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
      

      环境:Windows 10 企业版,VBA 7.1

      【讨论】:

        猜你喜欢
        • 2022-06-15
        • 1970-01-01
        • 2020-10-17
        • 1970-01-01
        • 2016-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多