Перейти к публикации

Открытие файла и запуск макроса из командной строки


Рекомендованные сообщения

Добрый день, уважаемые форумчане.

 

Может кто-нибудь сталкивался с запуском макросов из командной строки?

 

Хочу сделать автоматическое сохранение чертежей в pdf на pdm-сервере. Как кто-то кладёт файл чертежа нужно запустить SW, открыть этот файл и сохранить в PDF.

Думал приделать к этому делу макрос SaveAsPDF, но не получается его запустить.

 

Команда ниже просто открывает файл и всё.

"C:\Program Files\SOLIDWORKS 2019\SolidWorks\SLDWORKS.exe" "путь файла" /m "D:\Soft\SaveAsPDF\SaveAsPDF.swp"

 

Ссылка на сообщение
Поделиться на других сайтах


UnPinned posts
2 часа назад, Krusnik сказал:

Думал приделать к этому делу макрос SaveAsPDF, но не получается его запустить.

Что бы исключить сбои с приложением PDFCreator (если речь об этом макросе), неплохо бы подправить модуль SaveAsPDF_run:

Цитата

Sub main()
Dim Process As Object
        For Each Process In GetObject("winmgmts:").ExecQuery("Select * from Win32_Process")
                If Process.Caption Like "PDFCreator.exe" Then
                        Process.Terminate
                        Exit For
                End If
        Next

        
SaveAsPDF.Show '(vbModeless)

End Sub

Далее вероятно подумать как запусить файл и макрос из скрипта (самое итресное, что пример из ссылки запускает и работает с Excel, но не работает с Solidworks - возможно какие-то ограничения Windows не дают):

Цитата

Suppose your filename is test.vbs.

Commandline>test.vbs "book1.xlsx" "2nd Argument".

 VBScripts Arguments collection gives you access over argument passed in commandline.

Remember if path contain space enlose path in double quote.

Ниже то что в файле test.vbs:




dim XL
dim WB

dim args
dim arg

set args=wscript.arguments

set XL=createobject("Excel.Application")
xl.visible=1
set WB=XL.Workbooks.Open(args(0))
Wb.worksheets(1).Range("A1").value=args(1)

https://social.msdn.microsoft.com/Forums/office/en-US/6124691b-a5ce-4fc0-a648-e85b4a32f77a/excel-vba-to-read-command-line-parameters-and-copy-in-a-cell?forum=exceldev

 

 

и вот тут рассуждения по теме (не разбирался что к чему):

https://www.cyberforum.ru/vbscript-wsh/thread1435759.html

 

Изменено пользователем Kelny
Ссылка на сообщение
Поделиться на других сайтах

Как вариант наверно можно так, назначить горячую клавишу запуску макроса Инструменты-Макрос-Выполнить... (например, Ctrl+P), тогда можно запустить программу с документом чертежа, а потом через действия эмуляции клавиатуры запустить макрос, тогда файл скрипта test.vbs будет содержать:

Цитата

Option Explicit
Dim WshShell, oExec
dim swApp

dim args
set args=wscript.arguments

Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\SLDWORKS.exe "+ args(0))
WScript.Sleep 15000
WshShell.SendKeys("^P")
WshShell.SendKeys(args(1))
WshShell.SendKeys("{Enter}")

Задержку в 15 секунд (WScript.Sleep 15000) при желании можно попробовать уменьшить/увеличить.

 

Далее в командной строке:

Цитата

Concole>"c:\путь_скрипта\test.vbs" "c:\путь_файла\Чертёж.SLDDRW" "C:\путь_макроса\SaveAsPDFcreator.swp"

 

 

План Б, просто создаём приложение, которое откроет программу с выбранным файлом, запускает макрос, собирает информацию/ошибки о созданных файлах и завершает работу программы.

Изменено пользователем Kelny
Ссылка на сообщение
Поделиться на других сайтах
16 часов назад, Kelny сказал:

Что бы исключить сбои с приложением PDFCreator (если речь об этом макросе), неплохо бы подправить модуль SaveAsPDF_run:

У меня он поправлен. С вашей же подачи кстати )))

Вот так

Скрытый текст

Public Sub TestPrinter()
If InStr(GetAllPrinters(0), "PDFCreator") > 0 Then
    MPrint = -1
Else
    MPrint = 0
End If
End Sub

 

15 часов назад, Kelny сказал:

Как вариант наверно можно так, назначить горячую клавишу запуску макроса Инструменты-Макрос-Выполнить... (например, Ctrl+P), тогда можно запустить программу с документом чертежа, а потом через действия эмуляции клавиатуры запустить макрос, тогда файл скрипта test.vbs будет содержать:

 

Фокус не удался.

script.jpg

 

Насчет плана Б легко сказать... У меня вчера было 2 часа мозгового штурма, чтобы написать скрипт в dispatch'е, который из строки "чертеж.slddrw" убирает ".slddrw" и дописывает туда ".pdf"

 

Есть пара дефолтных  скриптов от Dassoult Systemes:

Один сохраняет в dxf. По крайней мере должен сохранять.

Второй может сохранять во много разных форматов, плюс куча настроек.

 

Но первый написан так, что даже прочитать проблема.

А из второго нужно выкинуть лишнее, плюс понять как и какие опции выставить.

Ссылка на сообщение
Поделиться на других сайтах
17 часов назад, Kelny сказал:

самое итресное, что пример из ссылки запускает и работает с Excel, но не работает с Solidworks - возможно какие-то ограничения Windows не дают

Покопался по офф. форуму.

Нашёл такой ответ:

 

You cannot run a SWP macro from command line. You would need a standalone that calls SolidWorks, then runs a specified macro.

 

Так что дело не в Windows.

 

Походу нужно переходить к плану Б.

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Krusnik сказал:

Фокус не удался.

В консоли пишете путь к файлам в кавычках? Без кавычек разделение пробелами получается как отдельные аргументы, а не строка целиком. Ошибка говорит, что в 9 строке не правильный адрес к файлу.

Посмотрите, что программа прочитала в аргументах WshShell.echo args(0), например:

Цитата

set args=wscript.arguments

WshShell.echo args(0)

WshShell.echo args(1)

Скопируйте путь из конслоли и попробуйте его открыть/запустить.

 

Скрипт по сути запрашивает форму запуска макроса через комбинацию клавиш, потом впечатывает в тектовое поле окна запуска макроса путь из консоли (второй аргумент - args(1) ) и эмулирует нажатие на клавиатуре ENTER.

Если программа не успевает открыть окно запуска макроса, то можно добавить паузу между строк, например:

Цитата

WScript.Sleep 15000
WshShell.SendKeys("^P")

WScript.Sleep 15000
WshShell.SendKeys(args(1))

WScript.Sleep 15000
WshShell.SendKeys("{Enter}")

Или для начала убрать из скрипта WshShell.SendKeys("{Enter}") и посмотреть, что скрипт вписывает в текстовое поле окна запуска макроса.

1 час назад, Krusnik сказал:

У меня вчера было 2 часа мозгового штурма, чтобы написать скрипт в dispatch'е, который из строки "чертеж.slddrw" убирает ".slddrw" и дописывает туда ".pdf"

Нужно было действовать без убирания, а в одно действие ЗАМЕНИТЬ, в VBA это обычно Replace (строка, что_ищем, чем_заменяем), то есть нжуно найти ".slddrw" и заменить на ".pdf".

Изменено пользователем Kelny
Ссылка на сообщение
Поделиться на других сайтах

@Krusnik есть ещё один вариант, через консоль копировать файл в определённую папку или в эту папку класть ссылки на файлы требующие конвертации (например файл .ТХТ), а макросе прописать открытие файла(ов) из папки/тектового документа с последующим открытием файлов и запуском макроса.

Тогда в консоли будет запуск только базового макроса без открытия файла, а открытие файла уже будет базовым макросом и запуск макроса преобразования можно из базового макроса.

Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Kelny сказал:

В консоли пишете путь к файлам в кавычках?

Да. Попробовал на всякий случай ещё раз. Результат тот же.

 

1 час назад, Kelny сказал:

Посмотрите, что программа прочитала в аргументах WshShell.echo args(0), например:

Я же не программист... Куда это нужно вставлять? В скрипт?

 

1 час назад, Kelny сказал:

Скопируйте путь из конслоли и попробуйте его открыть/запустить.

Какой путь, путь от чего? Или WshShell.Echo должно выдать путь?

 

1 час назад, Kelny сказал:

Скрипт по сути запрашивает форму запуска макроса через комбинацию клавиш, потом впечатывает в тектовое поле окна запуска макроса путь из консоли (второй аргумент - args(1) ) и эмулирует нажатие на клавиатуре ENTER.

Если программа не успевает открыть окно запуска макроса, то можно добавить паузу между строк, например:

Или для начала убрать из скрипта WshShell.SendKeys("{Enter}") и посмотреть, что скрипт вписывает в текстовое поле окна запуска макроса.

Это я понимаю, но скрипт просто не стартует. Ввожу в консоль всё в кавычках > Enter > ну и окошко, которое на скриншоте.

Ни SW не запустился, ни чертёж не открылся, вообще ничего.

 

1 час назад, Kelny сказал:

Нужно было действовать без убирания, а в одно действие ЗАМЕНИТЬ, в VBA это обычно Replace (строка, что_ищем, чем_заменяем), то есть нжуно найти ".slddrw" и заменить на ".pdf".

Ммммм. Это же dispatch. Не VBA. Отдельный геморойчик со своим скудным набором, встоенный в SWE PDM. Там такие трюки не работают.

https://help.solidworks.com/2019/russian/EnterprisePDM/Admin/c_dispatch_overview.htm

1 час назад, Kelny сказал:

@Krusnik есть ещё один вариант, через консоль копировать файл в определённую папку или в эту папку класть ссылки на файлы требующие конвертации (например файл .ТХТ), а макросе прописать открытие файла(ов) из папки/тектового документа с последующим открытием файлов и запуском макроса.

Тогда в консоли будет запуск только базового макроса без открытия файла, а открытие файла уже будет базовым макросом и запуск макроса преобразования можно из базового макроса.

Ну нет. В SWE PDM как только файл где-то создаётся (даже TXT) то сразу сервер делает тьму операций: создать массив данных, записать в них кучу информации (обозначение, наименование, автор и т.д.), потом прогнать файл по потоку работы, там разные условия (если - то и т.д.), всякие права доступа, рассылки сообщений...

Плюс он эти файлы вечно хранит. Даже если пользователь удалил файл, даже если это админ, сервер всё сохраняет. Там со временем будет адова туча текстовых файлов.

 

Нам однажды техподдержка одного CAD предлагала вместо передачи данных (обозначение, наименование и т.п.) непосредственно из файла на сервер создавать рядом ini файл, в котороый пользователи должны записывать эти данные, а сервер бы потом забирал. :hang2:

Ссылка на сообщение
Поделиться на других сайтах
10 часов назад, Krusnik сказал:

Я же не программист... Куда это нужно вставлять? В скрипт?

Сам любитель, но выше написал же:

12 часов назад, Kelny сказал:

...

set args=wscript.arguments

WshShell.echo args(0)

WshShell.echo args(1)

...

 

10 часов назад, Krusnik сказал:

Это я понимаю, но скрипт просто не стартует. Ввожу в консоль всё в кавычках > Enter > ну и окошко, которое на скриншоте.

Ни SW не запустился, ни чертёж не открылся, вообще ничего.

Откусываем лишнее от скрипта и пробуем ещё раз, например, только запуск (скрипт покажет аргументы в появляющихся окнах, потом попытается запустить программу, для начала можно и вовсе остановиться на показе аргументов удалив всё остальное) и ещё вероятно стоит добавить кавычек:

Цитата

Option Explicit
Dim WshShell, oExec
dim swApp

dim args
set args=wscript.arguments

WshShell.echo args(0)

WshShell.echo args(1)

Set WshShell = CreateObject("WScript.Shell")
Set oExec = WshShell.Exec("""C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\SLDWORKS.exe""")

Если получилось, меняем последнюю строчку, что бы с программой ещё и файл чертежа открыл (путь прописанный в "args(0)" - первом аргументе после скрипта),

Цитата

...

Set oExec = WshShell.Exec("""C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\SLDWORKS.exe"" "+ """"+args(0)+"""")

...

В конце концов вместо args(#) вписать те самые пути, что бы разобраться будет ли работать - после того как заработает уже использовать аргументы из консольной строки и возможно добавить кавычек (пара двойных ковычек, это одинарная ковычка в тексте между крайних кавычек текстовой строки), например (путь макроса вводиться в текстовое поле окна запуска макроса и там кавычки в текстовой строке не нужны, поэтому пар двойных кавычек там нет, в отличии от того что передаётся в консоль):

Цитата

...

Set oExec = WshShell.Exec("""C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS\SLDWORKS.exe"" "+ """c:\путь_файла\Чертёж.SLDDRW""")
WScript.Sleep 15000
WshShell.SendKeys("^P")
WshShell.SendKeys("C:\путь_макроса\SaveAsPDFcreator.swp")
WshShell.SendKeys("{Enter}")

 

10 часов назад, Krusnik сказал:

Какой путь, путь от чего? Или WshShell.Echo должно выдать путь?

Путь который вы вписываете для чертежа: откройте solidworks вручную, Файл-Открыть... и вставить скопированное из консоли.

Аналогично для макроса, только теперь выбираете Инструменты-Макросы-Запустить макрос.

WshShell.Echo "тут текст или переменная: " + args(0) - покажет окошко Windows  с текстом и в приведённом примере текст первого параметра в консоли.

 

 

Изменено пользователем Kelny
Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

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

Гость
Ответить в тему...

×   Вставлено в виде отформатированного текста.   Вставить в виде обычного текста

  Разрешено не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.




  • Сообщения

    • MagicNight
      Да дело не в бедности, ищу оптимальный ноут, пока не могу найти.
    • fenics555
      Уважаемые Дамы и Господа!  Есть библиотечные изделия, которые почему-то очень доооооолго грузятся в сборках. Я хочу попросить Вас потестить их и сказать в чем причина, ибо совсем невозможно работать. gost18829-73.prt.1 pin_split.prt.1 Как это всё можно ускорить?
    • gudstartup
      а вы хоть станок проверяли по программе на изделии на точность прежде чем товарищей этих выгнать? если нет то грешите на самих себя! система в наших краях еще не распространенная поэтому и тем тут нет надо в поднебесную писать
    • AlexArt
      Ну допустим, ты и на другом ресурсе это опубликовал. А не коммуниздил. Но вот продвигать воровство от государства, ворующее из Вики, это верх мерзости.
    • maxx2000
      Ах, да. Фильтры выбора добавили. Теперь можно выбрать только то что видно на первом плане, а не вместе с тем что с обратной стороны детали. В общем надо обновляться. Как раз работёнка на прессформу нарисовалась 
    • maxx2000
      Причина того - Кроилово. Кроилово всегда приводит к попадалову. Месяц простоял сколько мильонов деревянных потеряли? Вопрос риторический. И ещё будет стоять. Как памятник человеческой глупости и жадности.
    • AlexKaz
      "9 июля 1968 года на мышах был проведен самый знаменитый эксперимент американского ученого-этолога Джона Кэлхуна «Вселенная-25». Суть опыта заключалась в создании идеальных условий, где мыши могли бы жить и размножаться, не ведая никаких забот, вдали от хищников и в отсутствие эпидемий и заболеваний. Для этих целей ученый построил специальный загон, куда были помещены четыре пары белых мышей (самцов и самок). В распоряжении мышей всегда была чистая вода и еда в изобилии, специальные гнезда, где можно обустроить себе жилище ― гнезд в загоне хватало для проживания нескольких тысяч мышей. Температура в загоне в среднем составляла около 20 ℃ и была комфортной для мышей. Животные не подвергались никаким влияниям извне и жили в идеальных условиях в свое удовольствие. А дальше началось самое интересное. На первом этапе эксперимента мыши хорошо размножались, вели активный образ жизни, охотно играли. На следующей фазе эксперимента мыши стали есть меньше, перестали наедаться до отвала. На третьей фазе эксперимента, когда в загоне были уже сотни мышей, произошло распределение социальных ролей, стала ярко выраженной иерархия, клановость. Появились так называемые отверженные ― молодые особи, которых другие, взрослые мыши сгоняли в центр загона, не давали им вести нормальный образ жизни, причиняли физический вред. В природе такое, наверное, было бы невозможно, ведь эти мыши-агрессоры просто не дожили бы до старости: их бы съели хищники. Но в загоне Кэлхуна хищников не было, и взрослые мыши начали попросту издеваться над молодняком. Образовались две большие группировки: самцы-одиночки и самки-одиночки. При этом самки-одиночки отказывались спариваться <с менее статусными многочисленными молодыми самцами и с оставшимися старыми статусными> и отвергали ухаживания самцов. У мышей стал проявляться тотальный индивидуализм, мыши не стремились создать семью. На последней, четвертой стадии мышиная популяция стала сокращаться. Появились самцы, которых сам Кэлхун назвал «красивыми» (англ. beautiful ones), из-за отсутствия ран и рубцов. <В оригинале: They never engaged in sexual approaches toward females, and they never engaged in fighting, and so they had no wound or scar tissue. Thus their pelage remained in excellent condition. - Дословный перевод: Они никогда не прибегали к сексуальным подходам к самкам, и они никогда не участвовали в боях, и поэтому у них не было ран или рубцовой ткани. Таким образом, их шерсть сохранилась в отличном состоянии.> Эти мыши не вступали в борьбу за самок и территорию, не проявляли активности к размножению и только питались, спали и чистили шёрстку. У мышей стали проявляться различные формы девиантного поведения, вспышки агрессии. Самки стали проявлять агрессию, защищать себя сами, стали умерщвлять своих детенышей, а затем окончательно отказались размножаться. На пике эксперимента в загоне одновременно проживало чуть более двух тыс. мышей. Еды и гнезд было достаточно для дальнейшего роста популяции, но через четыре года после начала эксперимента Кэлхун остановил свой опыт, потому что в загоне осталось чуть более сотни мышей, и все они уже вышли из репродуктивного возраста. По итогам эксперимента Кэлхун пришел к выводу, что достижение определенной плотности населения и заполнение социальных ролей в популяции приводит к распаду общества" https://physicsoflife.pl/dict/pic/calhoun/calhoun.. https://scientificrussia.ru/articles/utopiya-dlya-mys.. https://ru.wikipedia.org/wiki/Кэлхун,_Джон_(этолог)
    • gudstartup
      @Koels вот в чем дело пока ds609 это предупреждение поэтому F может и не появится если sv601 это значит ошибка. возможно при нагреве радиатора серво определяет это как предупреждение или ваш вентилятор крутиться медленнее чем оригинальный и серва думает что он встал хотяпри этом обычно на экране в строке состояния FAN.мигает больше у меня вариантов нет....  
    • ДОБРЯК
      Решите любым алгоритмом. Тогда будет конструктивный разговор. :=)
    • Fedor
      https://en.wikipedia.org/wiki/List_of_numerical_analysis_topics#Eigenvalue_algorithms     :) 
×
×
  • Создать...