DSOfile,修改windows系统文件摘要
今天要做一個功能,就是修改圖片的摘要信息,一開始采用的是修改exif信息的方式,但是很多的圖片沒有exif信息,或者沒有指定的exif項,又找別的方法,來修改文件的摘要信息。
首先是采用ole32.dll,但是郁悶的是,這種方法可以修改很多文件的摘要信息,可就是修改不了圖片的摘要信息,無奈之下,只得另尋他法。
最后終于在cnblogs找到了一篇文章,里面詳細介紹了DSOFile.dll,于是趕緊下載下來,微軟官方的,免費的,開源的,甚至還呆著demo的,呵呵。
注冊dll,寫asp:
<%
?Set OPR = Server.CreateObject("DSOFile.OleDocumentProperties")
?OPR.open("E:/PaiMei_demo_001.jpg")
?Response.Write("Author:" & OPR.SummaryProperties.Author)
?OPR.SummaryProperties.Author = "0123456789"
?OPR.Save
?response.Write("<br />")
?Response.Write("Author:" & OPR.SummaryProperties.Author)
%>
呵呵,搞定!
缺點:如果文件地址中含有漢字的話,則會出錯,不過可以解決。
?
http://www.microsoft.com/china/technet/community/columns/scripts/sg0305.mspx#EVB
?
?
Dsofile:以前未講述過的故事
?
在我們起初開始編寫腳本的故事?時,我們想像自己是腳本世界中威風凜凜的、善于揭發丑聞的記者。在講述當今最受歡迎的腳本故事方面,腳本的故事?比其他任何人都領先一步;我們用我們深入的幕后報道吸引住了讀者,這樣的報告只有 Microsoft 腳本專家才能提供。實際上,我們最發愁的是如何禮貌地對普利策獎委員會說,“你瞧,朋友,雖然我們很珍視這個獎項,但我們每年都獲獎,也許你們應該將這個獎頒發給別人,就算是換一換人吧。難道紐約市沒有報紙嗎?也許你們可以將這個獎頒發給他們。”
可事實證明,事情并不像我們預想的那樣。這并不是說我們對腳本的故事?失望了;我們認為我們的小專欄幫助許多人克服了初次使用腳本時的恐懼,并使他們了解到使用腳本管理 Windows 并不比使用 GUI 工具管理 Windows 難(實際上往往是更加簡單)。我們對此非常高興。同時,看到紐約時報?的編委們環坐桌旁說,“又沒有比過‘腳本專家’!我們沒法兒跟他們競爭!”,這也是一件開心的事。不過,到目前為止,紐約時報?看起來并沒有太在意我們。
坦白。對于這種情況,也許我們也應當負一定的責任。別忘了,我們最近有一篇專欄文章的標題為我被大腳野人綁架了。這篇文章并沒有使“普利策獎得主”感到驚訝。
不過,這個月的情況就不同了;三月的腳本的故事?與被大腳野人綁架無關。我們帶來了一則真正的爆炸性新聞,您在別的地方是無法找到的、影響力極大的故事(除非您進行 Google 搜索或采用其他方法)。是的,這個月我們推出?Dsofile:以前未講述過的故事。
您剛才聽到那痛苦的叫聲了嗎?可能是紐約時報?的某位編委發出的吧。如果不是某位編委,那就是腳本專家 Peter Costantini 剛剛發現 Microsoft 自助餐廳不再出售他最喜歡的那種意大利式脆餅了。
什么是 Dsofile?
Dsofile 實際上是 Microsoft Developer Support OLE File Property Reader 2.0 Sample 的文件名 (Dsofile.dll)。(您必須承認,Microsoft 自有訣竅想出十分詭異的名稱。)不過,不要被這個名稱嚇倒哦。實際上,Dsofile(您可以從Microsoft 下載中心免費獲取它)是一種對腳本編寫者極其有用的工具:它為讀取和寫入您的所有文件的摘要信息屬性集提供了一種快速而簡便的方法。
您對此的第一反應可能是“這太難以置信了,你們為什么不早點告訴我們?!?”您的第二反應可能是“那么,摘要信息屬性又是什么呢?”如果您不清楚“文件的摘要信息屬性集”指的是什么,請執行以下操作。打開“Windows 資源管理器”或“我的電腦”,找到一個文件。(具體是哪個文件并不重要,不過我們建議您使用 Microsoft Office 文檔,因為這樣只需一兩分鐘就可以搞清楚。)右鍵單擊該文件,單擊“屬性”。在出現的對話框中,單擊“摘要”選項卡。您應當看到與以下內容類似的內容(如果與以下內容不一樣,請單擊“高級”按鈕):
這就是摘要信息;正如您所看到的那樣,可以向文件添加許多非常有用的元數據。更為重要的是,可以隨即使用這些元數據。舉個例子,如果您認真地填寫了“主題”、“類別”和“關鍵字”等字段,您就可以執行精確搜索,從而可以快捷而方便地查找文件。如下所示,使用 Microsoft Office 中的文件搜索命令,可以基于這些摘要信息屬性搜索文檔,新的 MSN 搜索工具也同樣可以基于這些屬性搜索文檔。
實際上,這正是腳本編寫者想要獲得的信息;在我們收到的信件中,有數十封都是詢問如何編寫可用來訪問摘要信息的腳本以及如何編寫可用來配置這些摘要信息的腳本。操作系統中內置的腳本編寫工具不具有此功能。的確,Shell 對象具有讀取這些摘要信息字段中的某些字段的功能。不過,Shell 對象無法向摘要信息字段執行寫入操作。Windows Script Host、文件系統對象、WMI 或操作系統中內置的其他任何工具都無法解決此問題。除此之外,還有許多好東西,但好像都無能為力。
這就是 Dsofile 大顯身手的地方。Dsofile 旨在為腳本編寫者提供一種獲取文件的摘要信息屬性的方法。Dsofile 中內置了一組屬性,這些屬性正好與 Microsoft Office 文檔的標準屬性相同。(這倒不足為奇:畢竟,Dsofile 是由 Office 小組開發的。)使用 Dsofile,您可以綁定到文檔并檢索關于以下各項的信息:
?
| 應用程序名 | 作者 | 字節數 |
| 類型 | 字符數 | 字符數(計空格) |
| 備注 | 公司 | 創建日期 |
| 最后一次打印時間 | 最后一次保存的日期 | 隱藏幻燈片數 |
| 關鍵字 | 最后的保存者 | 行數 |
| 經理 | 多媒體剪輯數 | 注釋數 |
| 頁數 | 段落 | 演示格式 |
| 修訂號 | 共享文檔 | 幻燈片數 |
| 主題 | 模板 | 標題 |
| 總編輯時間 | 版本 | 字數 |
?
正如我們說過的那樣,這些是 Microsoft Office 文檔中可以找到的屬性。但是,我們并不局限于從 Office 文檔檢索信息。我們還可以使用 Dsofile 綁定到其他類型的文件;例如,可以綁定到 .vbs 文件、.mp3 文件或其他文件。唯一需要說明的是,Dsofile 無法獲得上面列出的屬性之外的任何其他屬性。例如,.jpg 文件具有“寬度”、“高度”和“色彩深度”之類的屬性。雖然這些屬性很有用,但您無法使用 Dsofile 訪問這些屬性。
嗨,打住吧,Dsofile 并不是新玩意兒
可能會有一些持懷疑態度的人說:“打住。這是老皇歷了。Dsofile 已經推出好幾年了?!贝_實如此:不但 Dsofile 已推出數年,而且我們的“腳本中心”中甚至已經有一些示例腳本可以向您演示如何使用該實用工具。不過,一種新版本的 Dsofile 在十二月初悄悄地推出了;這就是我們為什么要發表本專欄文章,這就是我們為什么說要帶給您最新的消息。(假定兩個月后仍可算作最新消息。)不用您問我就會告訴您,該新版本 Dsofile 專用于 .NET 編程語言,不過據我們所知,與前一版本相比,它沒有添加任何新功能。
這兩種版本之間的區別就在那些利用 Dsofile 功能的腳本上。假設您已有舊版本的 Dsofile,現在您下載并安裝了該新版本。您的舊 Dsofile 腳本(與“腳本中心”提供的一樣)無法用于新版本的 Dsofile,這是因為使用舊版本時所需的腳本代碼與使用新版本時所需的腳本代碼之間存在一些差異。
例如,下面這個腳本使用舊版本的 Dsofile 檢索文檔作者的名稱:
Set objPropertyReader = CreateObject("DSOleFile.PropertyReader") Set objDocument = objPropertyReader.GetDocumentProperties _("C:/Scripts/New_users.xls") Wscript.Echo "Author: " & objDocument.AuthorSet objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:/Scripts/New_users.xls") Wscript.Echo "Author: " & objFile.SummaryProperties.Author下面是重寫后的腳本,此腳本用于新版本的 Dsofile:
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:/Scripts/New_users.xls") Wscript.Echo "Author: " & objFile.SummaryProperties.Author正如您看到的,兩個腳本都返回了文檔作者,這大概是二者唯一的相似之處。兩個腳本甚至連 ProgIds – DSOleFile.PropertyReader 和 DSOFile.OleDocumentProperties – 也不同。遺憾的是,隨 Dsofile 發布的短小文檔并沒有說清楚這一點;如果您不注意的話,您可能會像某位腳本專家那樣安裝了新版本 – 至少有一位腳本專家犯過這樣的錯誤,然后花費數小時嘗試查找為什么舊腳本不能用的原因。
那些確實對此持懷疑態度的人可能還在想,“小題大做!難道不可以只創建一個 Office 應用程序實例來獲得同樣的信息嗎?”可以。不過,使用 Dsofile 的價值不在于它能夠獲取其他應用程序(如 Microsoft Office)無法獲取的獨特信息,而在于它只具有這一項功能。使用 Dsofile 的腳本返回信息的速度比使用 Microsoft Office 的腳本快;因為您不需要僅為了確定文檔作者而創建一個 Word 或 Excel 實例。Dsofile 可以更快捷、更方便地獲取相同的信息,同時還節省了啟動 Office 應用程序的開銷。這就是?Dsofile 成為如此有用的工具的原因所在。
很好,但是如何使用 Dsofile 呢?
問得好!如果我們希望獲得今年的腳本編寫的普利策獎,那么,向您提供一些代碼可能會有所幫助。(如果他們真的設有腳本編寫方面的普利策獎的話,也會對我們實現這個“獲獎夢”有幫助的。)現在讓我們仔細研究一下我們這個可以返回文檔作者的腳本吧:
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:/Scripts/New_users.xls") Wscript.Echo "Author: " & objFile.SummaryProperties.Author正如您看到的,我們首先創建了一個?DSOFile.OleDocumentProperties?對象的實例。然后我們使用?Open?方法“打開”文件。(我們將“打開”一詞用引號引了起來,這是因為我們沒有以下面這種方式打開文件:啟動 Microsoft Excel 之類的應用程序,然后加載文檔。我們執行的操作實際上僅是綁定到文件附帶的摘要信息元數據。)
連接完成后,我們只回顯所需的摘要信息屬性的值。此處沒有什么特別的。唯一需要注意的是,我們需要引用 SummaryProperties 對象;因此我們使用了 objFile.SummaryProperties.Author 而沒有使用 objFile.Author。但這只是一種技巧;沒有數組,沒有奇怪的日期轉換,沒有我們大家已經開始喜歡的一些關于腳本的情況。
下面是一個更完整的腳本,該腳本檢索文件 C:/Scripts/New_users.xls 的全部摘要信息值。Dsofile 的另一項很好的功能是:如果您嘗試為一個與幻燈片無關的文件回顯?SlideCount?等屬性,并不會生成錯誤。您只是獲得一個 Null 值(如果為數字屬性,則為 0),腳本繼續順利運行。即使您檢索文本文件、Windows Media 文件或任何其他非 Microsoft Office 文檔的信息,情況也是如此。
代碼如下:
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:/Scripts/New_users.xls")Wscript.Echo "Application name: " & objFile.SummaryProperties.ApplicationName Wscript.Echo "Author: " & objFile.SummaryProperties.Author Wscript.Echo "Byte count: " & objFile.SummaryProperties.ByteCount Wscript.Echo "Category: " & objFile.SummaryProperties.Category Wscript.Echo "Character count: " & objFile.SummaryProperties.CharacterCount Wscript.Echo "Character count with spaces: " & objFile.SummaryProperties.CharacterCountWithSpaces Wscript.Echo "Comments: " & objFile.SummaryProperties.Comments Wscript.Echo "Company: " & objFile.SummaryProperties.Company Wscript.Echo "Date created: " & objFile.SummaryProperties.DateCreated Wscript.Echo "Date last printed: " & objFile.SummaryProperties.DateLastPrinted Wscript.Echo "Date last saved: " & objFile.SummaryProperties.DateLastSaved Wscript.Echo "Hidden slide count: " & objFile.SummaryProperties.HiddenSlideCount Wscript.Echo "Keywords: " & objFile.SummaryProperties.Keywords Wscript.Echo "Last saved by: " & objFile.SummaryProperties.LastSavedBy Wscript.Echo "Line count: " & objFile.SummaryProperties.LineCount Wscript.Echo "Manager: " & objFile.SummaryProperties.Manager Wscript.Echo "Multimedia clip count: " & objFile.SummaryProperties.MultimediaClipCount Wscript.Echo "Note count: " & objFile.SummaryProperties.NoteCount Wscript.Echo "Page count: " & objFile.SummaryProperties.PageCount Wscript.Echo "Paragraph count: " & objFile.SummaryProperties.ParagraphCount Wscript.Echo "Presentation format: " & objFile.SummaryProperties.PresentationFormat Wscript.Echo "Revision number: " & objFile.SummaryProperties.RevisionNumber Wscript.Echo "Shared document: " & objFile.SummaryProperties.SharedDocument Wscript.Echo "Slide count: " & objFile.SummaryProperties.SlideCount Wscript.Echo "Subject: " & objFile.SummaryProperties.Subject Wscript.Echo "Template: " & objFile.SummaryProperties.Template Wscript.Echo "Title: " & objFile.SummaryProperties.Title Wscript.Echo "Total edit time: " & objFile.SummaryProperties.TotalEditTime Wscript.Echo "Version: " & objFile.SummaryProperties.Version Wscript.Echo "Word count: " & objFile.SummaryProperties.WordCount當然,檢索摘要信息只是成功的一半;作為腳本編寫者,您還希望能夠配置這些屬性值。朋友,您很幸運。想要為文檔指定一個標題嗎?只需使用下面這樣的腳本即可:
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:/Scripts/New_users.xls")objFile.SummaryProperties.Title = "New title added via a script" objFile.Save我們再次創建一個 OleDocumentProperties 對象實例,然后調用?Open?方法打開文件。我們將標題?New title added via a script?賦給了 SummaryProperties.Title,然后調用?Save?方法。這樣就可以了。如果我們決定刪除文檔標題,我們只需將屬性值設置為空字符串,如下所示:
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:/Scripts/New_users.xls")objFile.SummaryProperties.Title = "" objFile.SaveDsofile 的一個缺點是它只能為 Microsoft Office 文檔寫入摘要信息字段。如果嘗試用腳本為其他文件(比如文本文件,即 .txt 文件)指定標題,則會發生失敗。這確實是生活中的一件傷心事。另外還請注意,并不是所有的屬性都是可寫入的;某些屬性是只讀的。您可以使用 Dsofile 更改文檔的“標題”或“主題”,但您不能 – 原因很明顯 – 使用 Dsofile 更改“字節數”或“創建日期”屬性。
話還沒有說完
一般的腳本編寫記者 – 比如那些就職于各主要腳本編寫新聞組織的人士 – 很可能覺得萬事大吉了,他們確信自己已經講清楚了您需要了解的所有關于 Dsofile 的情況。不過,您覺得“腳本專家”是一個輕言放棄的團隊嗎?
實際上我們是??墒俏覀兊木庉嬚f,“自定義文檔屬性呢?你們難道不認為人們會對自定義文檔屬性感興趣嗎?”因為她長得人高馬大,將近 11 英尺高,兩眼噴火,所以我們答應道,“好的,您說怎樣就怎樣。”(我們還要指出,既然她沒有刪掉“將近 11 英尺,兩眼噴火”,顯然這肯定是真的。)
那么這些自定義文檔屬性怎么樣呢?正如我們在前面介紹的,Microsoft Office 文檔帶有數十個內置的文檔屬性。但如果這些文檔屬性沒有完全滿足您的需要,那該怎么辦?沒問題,您可以向 Microsoft Office 文檔添加您自己的屬性。
例如,假設您想跟蹤文檔的上次查看日期。內置的文檔屬性沒有包括名為查看日期的屬性。沒關系,我們自己可以創建這樣的屬性:
Const msoPropertyTypeDate = 3Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:/Scripts/New_users.xls")objFile.CustomProperties.Add "Date Reviewed", msoPropertyTypeDate objFile.Save我們首先定義一個名為?msoPropertyTypeDate?的常量,將值 3 賦給它;這是要告訴 Dsofile 我們要添加的自定義屬性是日期字段。自定義屬性可以是以下任一類型:
?
| 常量 | 數據類型 | 值 |
| msoPropertyTypeNumber | 數字 | 1 |
| msoPropertyTypeBoolean | 布爾型(是/否) | 2 |
| msoPropertyTypeDate | 日期 | 3 |
| msoPropertyTypeString | 字符串 | 4 |
?
換句話說,如果我們要添加?Document Reviewed?屬性,并且我們只希望它指示文檔是否修改過,那么,我們就可以添加 Boolean 屬性,如下所示:
Const msoPropertyTypeBoolean = 2Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:/Scripts/New_users.xls")objFile.CustomProperties.Add "Document Reviewed", msoPropertyTypeBoolean objFile.Save現在回到“查看日期”屬性。我們接著綁定到文檔,訪問 CustomProperties 集合,調用?Add?方法,傳遞兩個參數:我們為新屬性指定的名稱(查看日期)和該新屬性的數據類型 (msoPropertyTypeDate)。然后我們調用?Save?方法將新屬性保存到 CustomProperties 集合。
當我們運行可以創建新的自定義屬性的腳本時,我們執行的操作實際上是留出一塊可以存儲信息的地方;默認情況下,沒有任何信息實際存儲在那里。(換句話說,我們有一個地方可以保存“查看日期”,但那個地方將是空的。)另外,這個新屬性不會出現在“屬性”對話框中,至少在您賦給它值之前不會。所以我們最好向您演示一下如何給這個新屬性賦值。
若要賦值,我們需要使用類似于以下代碼的腳本:
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:/Scripts/New_users.xls")Set objProperty = objFile.CustomProperties.Item("Date Reviewed") objProperty.Value = #2/16/2005# objFile.Save我們首先綁定到文件 C:/Scripts/New_users.xls。然后,我們創建一個指向我們的自定義屬性的屬性引用;這就是下面這行代碼的作用:
Set objProperty = objFile.CustomProperties.Item("Date Reviewed")我們設置該屬性的?Value,然后調用?Save?方法保存我們的更改。就這些?,F在,“查看日期”屬性將保存值2/16/2005。在為該屬性賦值之后,我們可以查看 New_users.xls 的“屬性”對話框。在查看時,將會看到與以下類似的內容:
順便說一下,用兩個井號 (#) 將日期括起來是標準的 VBScript 方法,旨在確保將日期作為日期而非作為字符串或某種數學表達式(比如,2 除以 16,再除以 2005)來傳遞。
您說得對:這確實更像諾貝爾獎,而不是普利策獎。但還可以變得更好。(那些在想“什么會比獲得諾貝爾獎更好?”的讀者沒有把 Dsofile 當回事兒,對吧?)您不需要使用 Windows 資源管理器來檢索文檔附帶的所有自定義屬性的值,您可以使用類似以下代碼的腳本:
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:/Scripts/New_users.xls")For Each objProperty in objFile.CustomPropertiesWscript.Echo objProperty.Name, objProperty.Value Next因為 CustomProperties 是一個集合,所以我們使用 For Each 循環來遍歷該集合中的所有項,回顯屬性名稱及賦給它的值。非常簡單,是吧?
如果您要刪除此自定義屬性,該怎么辦?綁定到文檔,設置一個指向要刪除的屬性的對象引用,然后調用?Remove方法:
Set objFile = CreateObject("DSOFile.OleDocumentProperties") objFile.Open("C:/Scripts/New_users.xls")Set objProperty = objFile.CustomProperties.Item("Date Reviewed") objProperty.Remove objFile.Save再次確保您調用了?Save?方法來保存對自定義屬性集的更改。
我們應該感謝普利策獎委員會…
…但是我們不能感謝他們,因為他們實際上還沒有頒發給我們普利策獎。不過,我們確實希望您會覺得 Dsofile 很有用。我們嘗試做的一件事情,就是幫助您將腳本編寫范圍擴大一點。您可能還記得,我們上個月介紹了?Log Parser,這也是操作系統未附帶但卻對腳本編寫者極其有用的工具。試用一下 Dsofile,告訴我們您覺得它如何(與往常一樣,您可以將您的電子郵件發送到以下地址:scripter@microsoft.com)。
如果您確實覺得它很有用,那么,在您下次與普利策獎委員會中的某位委員談話時,希望您可以提一下“腳本專家”。要是那樣的話,我們還真得收拾收拾我們在匆忙中馬馬虎虎買來的禮服,好好打扮一番。
轉載于:https://www.cnblogs.com/ywei221/p/3972054.html
總結
以上是生活随笔為你收集整理的DSOfile,修改windows系统文件摘要的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 论DATASNAP远程方法支持自定义对象
- 下一篇: Windows下 maven3.0.4的