今天要做一个功能,就是修改图片的摘要信息,一开始采用的是修改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.Author Set 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.Save
Dsofile 的一个缺点是它只能为 Microsoft Office 文档写入摘要信息字段。如果尝试用脚本为其他文件(比如文本文件,即 .txt 文件)指定标题,则会发生失败。这确实是生活中的一件伤心事。另外还请注意,并不是所有的属性都是可写入的;某些属性是只读的。您可以使用 Dsofile 更改文档的“标题”或“主题”,但您不能 – 原因很明显 – 使用 Dsofile 更改“字节数”或“创建日期”属性。
话还没有说完
一般的脚本编写记者 – 比如那些就职于各主要脚本编写新闻组织的人士 – 很可能觉得万事大吉了,他们确信自己已经讲清楚了您需要了解的所有关于 Dsofile 的情况。不过,您觉得“脚本专家”是一个轻言放弃的团队吗?
实际上我们是。可是我们的编辑说,“自定义文档属性呢?你们难道不认为人们会对自定义文档属性感兴趣吗?”因为她长得人高马大,将近 11 英尺高,两眼喷火,所以我们答应道,“好的,您说怎样就怎样。”(我们还要指出,既然她没有删掉“将近 11 英尺,两眼喷火”,显然这肯定是真的。)
那么这些自定义文档属性怎么样呢?正如我们在前面介绍的,Microsoft Office 文档带有数十个内置的文档属性。但如果这些文档属性没有完全满足您的需要,那该怎么办?没问题,您可以向 Microsoft Office 文档添加您自己的属性。
例如,假设您想跟踪文档的上次查看日期。内置的文档属性没有包括名为查看日期的属性。没关系,我们自己可以创建这样的属性:
Const msoPropertyTypeDate = 3 Set 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 = 2 Set 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 方法保存我们的更改。就这些。现在,“查看日期”属性将保存值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.CustomProperties Wscript.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)。
如果您确实觉得它很有用,那么,在您下次与普利策奖委员会中的某位委员谈话时,希望您可以提一下“脚本专家”。要是那样的话,我们还真得收拾收拾我们在匆忙中马马虎虎买来的礼服,好好打扮一番。