<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; VBS: Пример получения свойств документов Офиса]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=6865</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=6865&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «VBS: Пример получения свойств документов Офиса».]]></description>
		<lastBuildDate>Fri, 24 Feb 2012 20:52:49 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[VBS: Пример получения свойств документов Офиса]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=57208#p57208</link>
			<description><![CDATA[<p>Коллеги, представляю пример скрипта переименовывания документов Офиса на основании их свойств (автор, заголовок и проч.)</p><p><strong>Предистория:</strong> после восстановления офисных файлов с зачищенного &quot;нежданной&quot; установкой операционки с нуля (глюк SCCM) винта программой &quot;Restorer2000&quot; в разделе восстановления &quot;Lost Files&quot; находятся восстановленые по типам данных файлы, но имена файлов - просто числовое перечисление, а даты всех файлов - это дата восстановления.</p><p>Написанный &quot;на коленке&quot; скрипт Rename_OfficeDoc.vbs пробует получить из вордов/экселей свойства: дату модификации, имена автора и последнего правившего документ, заголовок документа - и формирует из этого новое имя файла по шаблону: <br /><strong>ГГГГ-ММ-ДД_ччмм _(е)автор_последних_правок _(t)заголовок_документа _(a)автор_документа _(прежнее_имя).*</strong><br />Если (a) совпадает с (e), то автора не показываем.</p><p>Этим скриптом я отсеял &quot;битые&quot; документы (где-то 10-20%), а на остальные - дал пользователю через переименование хоть какие-то намеки на содержимое и давность 4тыс. восстановленных документов, т.к. юзер видит документы в хронологии модификации и может понять - от кого получен, кем редактирован.</p><p>При работе скрипта используется объект &quot;DSOFile.OleDocumentProperties&quot; (регистрируем библиотеку dsofile.dll). Данная DLL в свободном скачивании - <a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=8422">Microsoft Developer Support OLE File Property Reader 2.1 Sample (KB 224351)</a> .</p><div class="codebox"><pre><code>&#039;--- RenamedDoc.vbs&#039;
&#039; Reading Document Properties, rename documents

&#039; Путь к обрабатывемому каталогу&#039;
&#039; sFolder = &quot;C:\Common\Develop\vbs\RenamedDoc\doc1&quot;
&#039; sFolder = &quot;\\uachpc077\c$\!ins\_RECOVER_FROM_036\Microsoft Excel 2007 XML Document&quot;
sFolder = &quot;\\uachpc077\c$\!ins\_RECOVER_FROM_036\Microsoft Word 2007 XML Document&quot;

gi_NeedTitle  = 1 &#039; 1 - добавляем Title документа / 0 - не обрабатываем, если остались документы с заголовком в нечитабельной кодировки&#039;
gi_NeedRename = 1 &#039; 1 - переименовываем документы / 0 - только формируем протокол (в папке документов) _log_RenamedDoc.txt с новыми именами&#039;

Set fso = CreateObject(&quot;Scripting.FileSystemObject&quot;)  
Set NewFile = fso.CreateTextFile( sFolder &amp; &quot;\_log_RenamedDoc.txt&quot;, True)
Set folder = fso.GetFolder(sFolder)
Set files = folder.Files
countDoc = 0 : countErr = 0 : countRen = 0
For each folderIdx In files
	If ( InStr(folderIdx.Name,&quot;.xls&quot;)&gt;0 OR InStr(folderIdx.Name,&quot;.doc&quot;)&gt;0 ) AND Left(folderIdx.Name, 2)&lt;&gt;&quot;~$&quot; Then
		countDoc = countDoc + 1
		sOldName = folderIdx.Name
		sLog = &quot;&quot;
		sNewName = uf_newNameDocFile (sFolder, sOldName)
		If sNewName=sOldName Then
			countErr = countErr + 1
			sLog = &quot;(no_read)&quot; &amp; vbTab &amp; sOldName &amp; vbTab &amp; &quot;--&quot;
		Else
			&#039;--- переименование файла&#039;
			Err.Clear
			On Error Resume Next
			If gi_NeedRename=1 Then fso.MoveFile sFolder &amp;&quot;\&quot;&amp; sOldName, sFolder &amp;&quot;\&quot;&amp; sNewName
			If Err.Number = 0 Then
				countRen = countRen + 1
				sLog = &quot;(renamed)&quot; &amp; vbTab &amp; sOldName &amp; vbTab &amp; sNewName 
			Else
				countErr = countErr + 1
				sLog = &quot;(err_rename)&quot; &amp; vbTab &amp; sOldName &amp; vbTab &amp; sNewName 
			End IF
			On Error GoTo 0
		End IF
		
		NewFile.WriteLine( sLog )
	End IF
	
Next
NewFile.Close

s = &quot;Doc:&quot; &amp; Cstr(countDoc) &amp; &quot; Err:&quot; &amp; Cstr(countErr) &amp; &quot; Ren:&quot;  &amp; Cstr(countRen)

msgbox s,,&quot;Finish&quot;


&#039; --- Формирование нового имени файла&#039;
&#039; Параметры: путь к документу, имя файла документа (файл должен быть word/excel)
&#039; Резульат - новое имя файла с добавленными слевой стороны имени файла свойствами офисного документа: 
&#039;   дата, последний_редактировавший, заголовок, автор_документа (если отличен от редактировавшего)&#039;
&#039; --------------------------------------------------------------------------------------------------
Function uf_newNameDocFile (pPath, pName)

	&#039; Microsoft Developer Support OLE File Property Reader 2.1 Sample (KB 224351)
	&#039; http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;id=8422
	Dim objDoc : Set objDoc = CreateObject(&quot;DSOFile.OleDocumentProperties&quot;)
	
	i = InStrRev( pName, &quot;.&quot; )
	sOld = Left( pName, i - 1) &#039;только имя файла&#039;
	ext = Right( pName, Len(pName) - i ) &#039;расширение файла&#039;
	s = &quot;&quot;
	
	Err.Clear
	On Error Resume Next
	objDoc.Open( pPath &amp; &quot;\&quot; &amp; pName) 
	If Err.Number = 0 Then
		sDt = &quot;&quot; &#039;время последнего редактирования в формате ГГГГ-ММ-ДД_ЧЧММ&#039;
		If len(Trim(objDoc.SummaryProperties.DateLastSaved))&gt;0 Then 
			sDt = objDoc.SummaryProperties.DateLastSaved
			sDt = Mid(sDt,7,4) &amp; &quot;-&quot; &amp;  Mid(sDt,4,2) &amp; &quot;-&quot; &amp; Mid(sDt,1,2) &amp; &quot;_&quot; &amp; Replace(Mid(sDt,12,5),&quot;:&quot;,&quot;&quot;)
		End IF
		If len(sDt)&gt;0 AND sDt&lt;&gt;&quot;--_&quot; Then s = s &amp; sDt
		If len(objDoc.SummaryProperties.LastSavedBy)&gt;0 Then s = s &amp; &quot; _(e)&quot;&amp; objDoc.SummaryProperties.LastSavedBy
		If gi_NeedTitle=1 Then &#039;есть требование обрабатывать Title&#039;
			If len(objDoc.SummaryProperties.Title)&gt;0 Then 
				sTitle = Trim( Replace(Replace(objDoc.SummaryProperties.Title, vbTab,&quot;&quot;), &quot;|&quot;,&quot;&quot;))
				If sTitle=&quot;Number:&quot; Then sTitle=&quot;&quot;
				If Len(sTitle)&gt;0 Then s = s &amp; &quot; _(t)&quot;&amp; sTitle
			End IF
		End IF
		If len(objDoc.SummaryProperties.Author)&gt;0 AND (objDoc.SummaryProperties.Author&lt;&gt;objDoc.SummaryProperties.LastSavedBy) _
			Then s = s &amp; &quot; _(a)&quot;&amp; objDoc.SummaryProperties.Author
		&#039; замены недопустимых и часто повторяемых символов&#039;
		s = Replace(s,&quot;і&quot;,&quot;i&quot;) &#039;украинская литера на латинскую&#039;
		s = Replace(s,&quot;“&quot;,&quot;`&quot;) &#039;разновидности кавычек&#039;
		s = Replace(s,&quot;”&quot;,&quot;`&quot;)
		s = Replace(s,&quot;«&quot;,&quot;`&quot;)
		s = Replace(s,&quot;»&quot;,&quot;`&quot;)
		s = Replace(s,&quot;&quot;&quot;&quot;,&quot;`&quot;)
		s = Replace(s,&quot;?&quot;,&quot;_&quot;) &#039;символы подстановок&#039;
		s = Replace(s,&quot;*&quot;,&quot;_&quot;)
		s = Replace(s,&quot;:&quot;,&quot;_&quot;)
		s = Replace(s,&quot;/&quot;,&quot;_&quot;)
		s = Replace(s,&quot;\&quot;,&quot;_&quot;)
		s = Replace(s,&quot;|&quot;,&quot;_&quot;)
		s = Replace(s,&quot;____&quot;,&quot;__&quot;) &#039;многократные дубли пробелов и подчеркиваний&#039;
		s = Replace(s,&quot;____&quot;,&quot;__&quot;)
		s = Replace(s,&quot;____&quot;,&quot;__&quot;)
		s = Replace(s,&quot;  &quot;,&quot; &quot;)
		s = Replace(s,&quot;  &quot;,&quot; &quot;)
	End IF
	If Len(s)&gt; 0 Then s = s &amp; &quot; (&quot; &amp; sOld&amp; &quot;).&quot; &amp; ext Else s = pName &#039;оставляем имя прежним, если свойства не были получены&#039;
	On Error GoTo 0
			
	Set objDoc = Nothing
	uf_newNameDocFile = s
End FUNCTION</code></pre></div><p>Скрипт писался на скорую руку, поэтому нет передачи аргументов, обхода каталогов и прочего - в первых строках скрипта выполняются индивидуальные настройки. Обработка каталога с doc/docx/xls/xlsx выклядела так:<br /> - правим путь к обрабатывемому каталогу<br /> - запускаем скрипт, ждем сообщения &quot;Финиш&quot;<br /> - переименованные файлы, выделив по маске *_*.* , перекладываем в другую папку<br /> - анализируем в протоколе _log_RenamedDoc.txt записи &quot;(err_rename)&quot; - определяем, что может в Titlt мешать переименовать файл. Если в Title документа какая-то нечитабельная каша - отключаем в скрипте обработку свойства Title: gi_NeedTitle = 0<br /> - Повторяем обработку, перенос переименованных файлов и анализ протокола. Если в логе остаются только записи &quot;(no_read)&quot;, то оставшиеся непереименованые файлы - битые.</p><p>Пример файла протокола:<br /></p><div class="codebox"><pre><code>(no_read)    119880.doc    --
(err_rename)    122475.doc    2003-09-26_1045 _(e)DokuchayevaL _(t)ПЕРЕЛІК ДОКУМЕНТІВ, НЕОБХІДНИХ ДЛЯ ВІДКРИТТЯ КОРПОРАТИВНОГО РАХУНКУ В НАЦІОНАЛЬНІЙ ВАЛЮТІ ТИПУ “Н” ТА РАХУНКУ В ІНОЗЕМНІЙ ВАЛЮ _(a)Gvozdyev Yuriy (122475).doc
(renamed)    128002.doc    2009-07-03_1050 _(e)NeduzhyiS _(t)Постачальник_        ПП `МОСТ-СЕРВІС` _(a)user (128002).doc
(renamed)    128462.doc    2009-11-23_1739 _(e)NeduzhyiS _(t)Оплата за рекламу в журналi ` Партнер -Черкаси` № 10-12, 2009 р (128462).doc
(renamed)    251401.doc    2011-10-12_1812 _(e)VietrovS _(t)Оплата за марки поштовi для регiонального вiддiлення АТ ` ОТП Банк` в м _(a)NeduzhyiS (251401).doc</code></pre></div><p>Может кому-то это пригодится. <img src="//forum.script-coding.com/img/smilies/roll.png" width="15" height="15" /></p>]]></description>
			<author><![CDATA[null@example.com (Rom5)]]></author>
			<pubDate>Fri, 24 Feb 2012 20:52:49 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=57208#p57208</guid>
		</item>
	</channel>
</rss>
