2014-09-29 3 views
0

Я пытаюсь выполнить команду в командной строке с помощью Shell Script в VBA Excel. Когда я запускаю эту команду в командной строке, она работает, печатая номер в качестве вывода. Но когда я вызываю ту же команду в скрипте, она не отображает этот номер в окне сообщения.Вызов командной строки и выполнение команды через оболочку Exec в VBA

Sub Button6_Click() 
    Dim oShell As Object 
    Dim objExecObject As Object 
    Set oShell = CreateObject("WScript.Shell") 
    Set objExecObject = oShell.Exec("cmd /c convert test2.jpg -fill black +opaque white -fill white -opaque white -print %[fx:w*h*mean]") 
    MsgBox (objExecObject.StdOut.ReadAll) 
End Sub 

Я думаю, что проблема связана с аргументами в функции Exec, поскольку существует несколько слов. Поэтому я попробовал следующее, объединив строку, как показано. Но это тоже не работает.

Dim command As String 
    command = "convert test2.jpg -fill black +opaque white -fill white -opaque white -print %[fx:w*h*mean] null:" 
    Set objExecObject = oShell.Exec("cmd /c " & command) 

Кажется, что нет ошибки времени выполнения, и окно сообщения всегда возвращается пустым без печати номера. FOR CLARITY, команда convert - это функция, предоставляемая ImageMagick.

Пожалуйста, расскажите, как я могу распечатать команду «Запустить команду» в командной строке и распечатать вывод командной строки в окне сообщения.

Большое спасибо.

+0

Это сработало. Set objExecObject = oShell.Exec ("cmd/c convert test2.jpg -fill black + opaque white -fill white -opaque white -print% [fx: w * h * mean] null:") Нуль в конце команды была проблема. Также убедитесь, что путь к файлу является абсолютным, что в моем случае не было проблемой. – user2048724

ответ

1

Когда команда «работает» из консоли, но «не может», когда .Exec'ed, обычные подозреваемые

  1. тракты -> использовать кавычки полные/абсолютные данные файла для исполняемых файлов и файлов данных
  2. разрешения -> проверка пользователя (s)/прав
  3. консоль запускает оболочку против .Exec запускает процесс

В вашем случае смысл "произведения/неисполнению не совсем понятно. Симптом «MsgBox не показывает число». Возможно, конвертирует запись в StdErr. Так что попробуйте:

MsgBox objExecObject.StdErr.ReadAll() 

или - лучше -

If Not objExecObject.StdErr.AtEndOfStream Then MsgBox objExecObject.StdErr.ReadAll() 

Если это не помогает, используйте .run() с "% COMSPEC%/к".

Update WRT комментарий:

Начало преобразования из консоли и перенаправлять его выход в файл для дальнейшей проверки.

+0

1,2,3 не являются проблемой. Оба кодекса не работали. Когда я использую Run, тогда команда работает над cmd, но мне нужен вывод (номер в этом случае), чтобы я мог записать это в ячейке excel. С запуском я не смогу это сделать. – user2048724