2016-07-23 2 views
1

Для небольшого проекта я хочу, чтобы макрос открыл cmd.exe, а затем выполнил несколько строк кода.Как ввести несколько строк кода в CMD из VBA?

Я искал в Интернете несколько хороших примеров и не нашел нужного решения. Код, который я попытался модифицирование заключается в следующем:

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 в командной строке?

С уважением, 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-файл после того, как это сделано, вы можете удалить его с Kill

+0

Спасибо, это работает! Я добавил «Application.Wait (Now + # 12: 00: 03 AM #)» в код перед командой Kill, теперь файл был выполнен в течение 3 секунд, а затем он был убит. – Dubblej

+0

Нет проблем! Обычно я использую функцию sleep(), когда хочу отложить код. '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

Смежные вопросы