Что нового

[Автоматизация] Преобразование из .vsd в .pdf

Boroda

Новичок
Сообщения
6
Репутация
0
Версия AutoIt: 3.3.8.1
Описание: есть файлик(и) с расширением .vsd (т.е. Visio). Нужно автоматизировать процесс его открытия и сохранения в формате pdf.

P.S. Было бы вообще замечательно если с поддержкой нескольких файлов в командной строке, т.е. если $CmdLine = {'test1.vsd', 'test2.vsd' ...}. Т.е. чтобы на "скомпилированный .exe" можно было перетянуть пачку файлов и получить в той папке, откуда файлы -- pdf-ники. После пересохранения файла нужно выходить из Visio и для каждого нового файла его (Visio) запускать.
 
Автор
Boroda

Boroda

Новичок
Сообщения
6
Репутация
0
Собственно, чтобы не думали, что сам вообще ничего... вопросы такие:

1. Как запусить Визио с передачей ему параметров через comandline?
Чет вот так не получается:
Код:
Run("visio.exe $CmdLineRaw")
Вся проблема в том, что у меня даже
Код:
Run("visio.exe")
не отрабатывает. Хотя из командной строки (консоли) visio.exe запускается.

2. Как запустить ту программу, которая в данный момент ассоциирована с данным расширением? Т.е. я хочу сделать нечто типа:
Код:
Run("Document.vsd")
 

---Zak---

Скриптер
Сообщения
455
Репутация
120
Boroda
Для запуска DOS (console) команд, попробуйте Run(@ComSpec & " /c " & 'commandName', "", @SW_HIDE) ; не забывайте " " перед "/c"

Код:
Run(@ComSpec & " /c " & 'visio.exe')

$Program = 'visio.exe'
$CmdLine = 'C:\test1.vsd'
Run(@ComSpec & " /c " & $Program &' '& $CmdLine)
 
Автор
Boroda

Boroda

Новичок
Сообщения
6
Репутация
0
Спасибо.
Потихоньку проясняется.

Имеем вот такой код:
Код:
if $CmdLine[0] > 0 Then
	ShellExecute($CmdLine[1])

	WinWait($CmdLine[1])
	$hWnd = WinWaitActive($CmdLine[1], "", 5) ; 
	If Not $hWnd Then
	    MsgBox(4096, 'Info', 'Some torubles')
	    Exit
	EndIf

	WinActivate($hWnd)

	Send("!fa")

	Sleep(1000)

	; WinClose($hWnd)

Else
	MsgBox(0,"Info","No params")
EndIf


Так вот конструкция Send("!fa") не хочет вызывать окно Save As...
:(

Чего не так делаю?
 
Автор
Boroda

Boroda

Новичок
Сообщения
6
Репутация
0
Вероятно у вас кодировка по умолчанию - русская.
Так в том то и дело, что нет. И винда тоже не русская. :(

OffTopic:
А как тут работает цитирование? А то что-то у меня не получается? А есть быстрый ответ?


Сделал так:
Код:
WinMenuSelectItem($hWnd, '', '&File', '&Save As...')


Всё равно просто запускается Визио и... тишина :(


Добавлено:
Сообщение автоматически объединено:

Разобрался...
Код зависает на
Код:
WinWait($CmdLine[1])


Сейчас буду смотреть почему.


Добавлено:
Сообщение автоматически объединено:

Разобрался.

Я жду появления окна с именем $CmdLine[1], а ведь в этой строке имя с расширением. :smile:


Добавлено:
Сообщение автоматически объединено:

Собственно теперь вопрос: Как выбрать элемент выпадающего списка по его имени?
 
Автор
Boroda

Boroda

Новичок
Сообщения
6
Репутация
0
Спасибо. Разобрался.

Получается вот так:

Код:
if $CmdLine[0] > 0 Then
ShellExecute($CmdLine[1])

$Name=StringTrimRight($CmdLine[1], 4)

WinWait($Name)

$hWnd = WinWaitActive($Name, "", 5) ; 
If Not $hWnd Then
    MsgBox(4096, 'Info', 'Some torubles')
    Exit
EndIf

WinActivate($hWnd)


;WinMenuSelectItem($hWnd, '', '&File', '&Save As...')

Send("!fa",0)


$h1Wnd = WinWaitActive("Save As", "", 5) ; 
If Not $h1Wnd Then
    MsgBox(4096, 'Info', 'Some torubles')
    Exit
EndIf

ControlCommand ($h1Wnd, "", "[CLASS:ComboBox; INSTANCE:2]", "SelectString", 'PDF')

Send("!sy",0)

Sleep(2000)

WinClose($hWnd)


Else
	MsgBox(0,"Info","No params")
EndIf


Всё работает. Компилирую. Запускаю exe и не работает. Визио открывается, а вот выбор меню уже не происходит :(

Что не так?


Добавлено:
Сообщение автоматически объединено:

Дурдом. Всё работает. Но если через командную строку, т.е. вот так:
Код:
VSD2PDF.exe Drawing1.vsd
А если перетаскиванием файла на этот ехе-шник, то не хочет :(


Добавлено:
Сообщение автоматически объединено:

Понял, при перетаскивании передается полный путь к файлу. :(

Есть какой-то простой способ из строки с путёй к файлу именем и расширением выделить только имя файла?


Добавлено:
Сообщение автоматически объединено:

Победил.

Т.к. в регекспах не силен, а разбираться как всегда лень, то вот так вот коряво:
Код:
Local $Name=StringTrimRight(StringRegExpReplace($CmdLine[1], ".+\\(.+)\..+", "\1", 1),4)
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Boroda
Если в начале скрипта включить
Код:
Opt("WinTitleMatchMode", 2)
то можно определять окна по любой части текста заголовка. Например окно с заголовком "какое-то_имя_файла - Visio" можно будет найти про слову "Visio".
 
Автор
Boroda

Boroda

Новичок
Сообщения
6
Репутация
0
Финальный вариант:

Код:
if $CmdLine[0] > 0 Then
ShellExecute($CmdLine[1])

Local $Name=StringTrimRight(StringRegExpReplace($CmdLine[1], ".+\\(.+)\..+", "\1", 1),4)

WinWait($Name)

$hWnd = WinWaitActive($Name, "", 5) ; 
If Not $hWnd Then
    MsgBox(4096, 'Info', 'Some torubles')
    Exit
EndIf

WinActivate($hWnd)

Send("!fa",0)

$h1Wnd = WinWaitActive("Save As", "", 5) ; 
If Not $h1Wnd Then
    MsgBox(4096, 'Info', 'Some torubles')
    Exit
EndIf

ControlCommand ($h1Wnd, "", "[CLASS:ComboBox; INSTANCE:2]", "SelectString", 'PDF')

Send("!sy",0)

Sleep(5000)

WinClose($hWnd)

Else
	MsgBox(0,"Info","No params")
EndIf


Да, все далеко не идеально, но... оно как-то работает. Во всяком случае у меня на локальной машине. На днях попробуем в реальной жизни.
 
Верх