Как стать автором
Обновить

Комментарии 5

Есть только одна большая проблема, длина командной строки ограничена 256 символами, что может очень сильно мешать.
плюс ко всему нет возможности прочитать отдельно лог ошибок

мой пример лишен этих проблем
ClassMethod ExecuteCommand(cmd As %String, errmsg As %String, Output result As %String, display = 0) As %Status
{
	s tmpLog=##class(%FileBinaryStream).%New()
	d tmpLog.Write(""),tmpLog.SaveStream()
	s errLog=##class(%FileBinaryStream).%New() 
	d errLog.Write(""),errLog.SaveStream()
	s ec=$zf(-1,cmd_" 1>"""_tmpLog.Filename_""" 2>"""_errLog.Filename_"""")
	i display d tmpLog.OutputToDevice()
	if $isobject($g(errmsg)) {
		d errmsg.CopyFrom(errLog)
	} else {
		s errmsg=errLog.Read()
	}
	if $isobject($g(result)) {
		d result.CopyFrom(tmpLog)
	} else {
		s result=""
		while 'tmpLog.AtEnd {
			s result=result_tmpLog.Read()
		}

	}
	d errLog.Clear()
	d tmpLog.Clear()
	q $$$OK
}

Так же мое решение еще и кроссплатформенное
Весьма элегантно — снимаю шляпу. Но с использованием файлов на сервере — я хотел без них. Понравилось разделение потоков ошибок и stdout
Оказывается оба варианта уже реализованы хотя второй смотрю видимо только начиная с 2012 версии
и в RunCommandViaZF идет объединение stdout и stderr, что не всегда может быть удобно
Зарегистрируйтесь на Хабре, чтобы оставить комментарий