Что нового

Как определить путь к активному файлу в Word?

TomashUA

Новичок
Сообщения
8
Репутация
0
Можно ли с помощью AutoIt определить полный путь к активному файлу(не процессу!)?
Допустим запущен Word. Файл уже имеет имя и лежит где-то на диске. Как узнать к нему путь?
Объясню зачем. Бывает при работе ситуация, когда нужно удалить определенный текст, таблицу и др. Но есть ненулевая вероятность, что в будущем нужно будет вернутся к предыдущему варианту. А сохранять материал, который будет удален тот еще геморрой, особенно если это нужно делать много раз за день, причем с разными документами :stars:.
Я планирую написать макрос, который по горячей клавише:
1) сохраняет активный файл;
2) определяет текущую дату и время;
3) копирует файл в папку Backup с именем ИмяФайла_ДатаВреемя.docx(Договор_201206151745.docx, например).
После чего я продолжаю работать в Договор.docx.
Аналогичная программу я написал для AutoCAD-a, но на Autolisp-e. Работает прекрасно, но написана только для автокада.
Главная отличие: в ворде при сохранении с помощью Save As и изменении имени файла я остаюсь в уже переименованном файле, а в автокаде - в исходном.
Так как определить путь к активному файлу? Или может есть другой способ обойти этот нюанс?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Re: Как определить путь к активному файлу?

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

Такой пример посмотрите что покажет при открытом документе (из справки к WinAPIEx.au3 )

Саму WinAPIEx.au3 и APIConstants.au3 брать здесь:
http://autoit-script.ru/index.php/topic,47.0.html

Код:
#Include <APIConstants.au3>
#Include <Array.au3>
#Include <WinAPIEx.au3>

Opt('MustDeclareVars', 1)

Global $hToken, $aAdjust, $aList = 0

; Enable "SeDebugPrivilege" privilege for obtain full access rights to another processes
$hToken = _WinAPI_OpenProcessToken(BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY))
_WinAPI_AdjustTokenPrivileges($hToken, $SE_DEBUG_NAME, $SE_PRIVILEGE_ENABLED, $aAdjust)

; Retrieve command-line arguments for all processes the system
If Not (@error Or @extended) Then
    $aList = ProcessList()
    For $i = 1 To $aList[0][0]
        $aList[$i][1] = _WinAPI_GetProcessCommandLine($aList[$i][1])
    Next
EndIf

; Enable SeDebugPrivilege privilege by default
_WinAPI_AdjustTokenPrivileges($hToken, $aAdjust, 0, $aAdjust)
_WinAPI_CloseHandle($hToken)

_ArrayDisplay($aList, '_WinAPI_GetProcessCommandLine')
 
Автор
T

TomashUA

Новичок
Сообщения
8
Репутация
0
Re: Как определить путь к активному файлу?

К сожалению, не помогло.
Запустил два файла в ворде.
Запустил скрипт с вашим кодом.
В колонке, где мог бы быть путь, написано /n /dde.
Скриншот прикрепил.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Re: Как определить путь к активному файлу?

TomashUA,
Попробуйте так с открытым файлом Word.
Код:
#include <Word.au3>

$hWinWord = WinGetHandle('[Class:OpusApp]');Class - OFFICE 2003
If Not $hWinWord Then Exit -3

$oWordApp = _WordAttach($hWinWord, 'HWND')
If @error Then Exit -4
$oDoc = _WordDocGetCollection($oWordApp, 0)
$sPath = $oDoc.FullName
$sFileName = $oDoc.Name
MsgBox(64, 'Info', 'Path: ' & $sPath & @LF & 'FileName: ' & $sFileName)
$sNow = @MDAY & '_' & @MON & '_' & @HOUR & '_' & @MIN & '_' & @SEC & '_'
FileCopy($sPath, @ScriptDir & '\BackUpWord\' & $sNow & $sFileName, 9)


PS
Добавьте, пожалуйста, в название темы про Word.
 
Автор
T

TomashUA

Новичок
Сообщения
8
Репутация
0
Спасибо, кажется получилось. :smile:
Добавил горячие клавиши, поменял местами сохранение и вывод окна(сохраняем, а потом выводим окно). Файл сохраняется последний активный в ворде.
Возникло 3 вопроса:
1) Как прописать конкретный путь сохранения? Я поменял путь на
Код:
FileCopy($sPath, 'D:\BackUpWord\' & $sNow & $sFileName, 9)

но скрипт вылетает без сообщений.
2) Как добавить в пути месяц и дату (создать папки)?
Идеальным был бы вариант - D:\BackUpWord\Месяц\Дата\ИмяФайла
3) Как сделать бекап в фоновом режиме, т.е. без последнего окна. Я пытался его закоментировать, но скрипт снова вылетает.
Код в результате:
Код:
#include <Word.au3>
HotKeySet("+{F11}", "SaveBackup")

While 1
    Sleep(100)
WEnd

Func SaveBackup() 
$hWinWord = WinGetHandle('[Class:OpusApp]');Class - OFFICE 2003
If Not $hWinWord Then Exit -3
$oWordApp = _WordAttach($hWinWord, 'HWND')
If @error Then Exit -4
$oDoc = _WordDocGetCollection($oWordApp, 0)
$sPath = $oDoc.FullName
$sFileName = $oDoc.Name
$sNow = @MDAY & '_' & @MON & '_' & @HOUR & '_' & @MIN & '_' & @SEC & '_'
FileCopy($sPath, @ScriptDir & '\BackUpWord\' & $sNow & $sFileName, 9)
MsgBox(64, 'Info', 'Path: ' & $sPath & @LF & 'FileName: ' & $sFileName)
 EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
TomashUA,
Вопросов многовато для одной темы. Попробуйте примерно так.
Код:
#NoTrayIcon
#include <Word.au3>

_WordErrorHandlerRegister()

HotKeySet('1', '_Word_Backup')
HotKeySet('{Esc}', '_Exit')

While 1
	Sleep(100)
WEnd

Func _Word_Backup()
	Local $h_WinWord, $o_WordApp, $s_Path, $s_FileName, $s_Now = @HOUR & '_' & @MIN & '_' & @SEC & '_', _
			$s_BackUpDir = 'D:\BackUpWord\' & @YEAR & '\' & @MON & '\' & @MDAY & '\';не будет работать, если нет диска D
	$h_WinWord = WinGetHandle('[Class:OpusApp]')
	If Not $h_WinWord Then
		ConsoleWrite('No Word Open' & @LF)
		Return
	EndIf
	$o_WordApp = _WordAttach($h_WinWord, 'HWND')
	If @error Then
		ConsoleWrite('Error' & @LF)
		Return
	EndIf
	$s_Path = $o_WordApp.ActiveDocument.FullName
	$s_FileName = $o_WordApp.ActiveDocument.Name
	If Not FileExists($s_Path) Or Not $s_FileName Then
		ConsoleWrite('Error' & @LF)
		Return
	EndIf
	If FileCopy($s_Path, $s_BackUpDir & $s_Now & $s_FileName, 9) Then
		ConsoleWrite('OK' & @LF)
		Return
	EndIf
	ConsoleWrite('Error' & @LF)
EndFunc   ;==>_Word_Backup

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
TomashUA [?]
Можно ли с помощью AutoIt определить полный путь к активному файлу
Код:
#include <Word.au3>
$oWordApp = _WordCreate('C:\my_text.doc')
MsgBox(0, @ScriptName, $oWordApp.ActiveDocument.Path & $oWordApp.PathSeparator & $oWordApp.ActiveDocument.Name)
_WordQuit($oWordApp)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Garrett,
Код:
$oWordApp.ActiveDocument.Path & $oWordApp.PathSeparator & $oWordApp.ActiveDocument.Name
и
Код:
$oWordApp.ActiveDocument.FullName
ИМХО, одно и то же. :smile:
 
Автор
T

TomashUA

Новичок
Сообщения
8
Репутация
0
madmasles, спасибо!
Некоторое время ушло на отладку. Скрипт почему то не работал. Заработал, когда я закоментировал
Код:
;~ HotKeySet('{Esc}', '_Exit')

и
Код:
;~  Func _Exit()
;~      Exit
;~   EndFunc   ;==>_Exit

Но это не существенно, меня устраивает.
Последний вопрос. Как мне перед бекапом сохранить файл(просто сохранить), так как скрипт, естественно, копировал файл в виде предыдущего сохранения.
Я попробовал дописать:
Код:
_WordDocSave($o_WordApp)

- результата никакого. Не сохраняет и не бекапит.
Мой последний работающий вариант:
Код:
;~ #NoTrayIcon
#include <Word.au3>

_WordErrorHandlerRegister()

HotKeySet('+{F11}', '_Word_Backup')
;~ HotKeySet('{Esc}', '_Exit')

While 1
    Sleep(100)
WEnd

Func _Word_Backup()
  
   
    Local $h_WinWord, $o_WordApp, $o_Doc, $s_Path, $s_FileName, $s_Now = @HOUR & '_' & @MIN & '_' & @SEC & '_', _
            $s_BackUpDir = 'D:\BackUpWord\' & @YEAR & '\' & @MON & '\' & @MDAY & '\';не будет работать, если нет диска D
    
	
	$h_WinWord = WinGetHandle('[Class:OpusApp]')	
    If Not $h_WinWord Then
        ConsoleWrite('Error' & @LF)
        Return
	 EndIf
	 
    $o_WordApp = _WordAttach($h_WinWord, 'HWND')
	    If @error Then
        ConsoleWrite('Error' & @LF)
        Return
	 EndIf
	 
    $o_Doc = _WordDocGetCollection($o_WordApp, 0)
	If @error Then
        ConsoleWrite('Error' & @LF)
        Return
	 EndIf
	 
;~ 	 _WordDocSave($o_WordApp)
	 
    $s_Path = $o_Doc.FullName
    $s_FileName = $o_Doc.Name
    If Not FileExists($s_Path) Or Not $s_FileName Then
        ConsoleWrite('Error' & @LF)
        Return
    EndIf
    If FileCopy($s_Path, $s_BackUpDir & $s_Now & $s_FileName, 9) Then
        ConsoleWrite('OK' & @LF)
        Return
    EndIf
    ConsoleWrite('Error' & @LF)
EndFunc   ;==>_Word_Backup

;~  Func _Exit()
;~      Exit
;~   EndFunc   ;==>_Exit
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
TomashUA [?]
Последний вопрос.
madmasles [?]
Вопросов многовато для одной темы.

Предупреждение За нарушение общих правил (пункт В.4):
Не лепите несколько вопросов разной тематики в один пост. По типу "Ребят, а ещё такой вопрос...". Каждый вопрос в свою тему.


С уважением, ваш Модератор.
 
Верх