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

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


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

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

 

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

 

Хочу сделать автоматическое сохранение чертежей в 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 пользователей

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




×
×
  • Создать...