更新详情“;“内容状态”;使用Perl/Batch/Python处理MS-Word文档

更新详情“;“内容状态”;使用Perl/Batch/Python处理MS-Word文档,python,perl,batch-file,ms-word,Python,Perl,Batch File,Ms Word,我目前正在尝试修改Windows资源管理器中MS Word.docx文件属性“详细信息”部分出现的“内容状态”字段(即,右键单击Windows资源管理器中的文件>属性>详细信息),如下面的屏幕截图所示 属性>详细信息“> 有人知道如何使用Perl脚本(或者最终使用批处理脚本或python)更改“内容状态”的值吗 我熟悉Win32:OLE来修改Excel和Word文档,但不知道如何解决这个问题 感谢属性可以在docProps/core.xml文件中找到。 更改此xml元素的内容将更新您引用的字段。

我目前正在尝试修改Windows资源管理器中MS Word.docx文件属性“详细信息”部分出现的“内容状态”字段(即,右键单击Windows资源管理器中的文件>属性>详细信息),如下面的屏幕截图所示

属性>详细信息“>

有人知道如何使用Perl脚本(或者最终使用批处理脚本或python)更改“内容状态”的值吗

我熟悉Win32:OLE来修改Excel和Word文档,但不知道如何解决这个问题

感谢属性
可以在
docProps/core.xml
文件中找到。 更改此xml元素的内容将更新您引用的字段。(假设您在这里谈论的是docx文件)


使用
Archive::Zip
您将能够打开docx文件并访问core.xml文件,更改其内容并将内容压缩回更新的docx文件。

多亏了“Haf Linger”,我找到了问题的答案:

#!perl

use strict;
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );

##CONFIG##
my $new_status="Closed";
my $docx_name="TEST.docx";
my $tmp_name="tmp.docx";
my $replace_file=1; #set to 0 for testing purpose
####

#Open docx file
my $doc = Archive::Zip->new($docx_name);

#Retrieve old status
my $old_status=undef;
my $new_content=$doc->contents('docProps/core.xml');
if ($new_content=~s%<cp:contentStatus>\s*(.*?)\s*</cp:contentStatus>%%) {
    $old_status=$1;
} else {}

#Update with new status
printf "Update status of $docx_name to '$new_status'%s: ",
    (defined $old_status ? " (previously '$old_status')" : "");
$new_content=~s%(</cp:coreProperties>)%<cp:contentStatus>$new_status</cp:contentStatus>$1%;
my ($content, $status) = $doc->contents('docProps/core.xml',$new_content);
if ($status) { 
    print "error during update of status of $docx_name ($!)\n"; 
} else {
    print "done!\n";
}

#Save file to temporary file
unless ( $doc->writeToFileNamed($tmp_name) == AZ_OK ) {
       die 'write error';
   }

#Replace if needed
if ($replace_file) {
    use File::Copy;
    move($tmp_name, $docx_name);
} else {}
#!perl
严格使用;
使用Archive::Zip qw(:错误代码:常量);
##配置##
我的$new\u status=“已关闭”;
我的$docx_name=“TEST.docx”;
我的$tmp_name=“tmp.docx”;
出于测试目的,我的$replace_file=1;#设置为0
####
#打开docx文件
我的$doc=Archive::Zip->new($docx\u name);
#检索旧状态
我的$old_status=未定义;
我的$new_content=$doc->contents('docProps/core.xml');
如果($new_content=~s%\s*(.*?\s*%){
$old_status=$1;
}else{}
#更新为新状态
printf“将$docx_name的状态更新为“$new_状态“%s:”,
(定义为$old_status?”(以前的“$old_status”):“”);
$new\u content=~s%()%$new\u status$1%;
我的($content,$status)=$doc->contents($docProps/core.xml',$new\u content);
如果($状态){
打印“更新$docx_name($!)状态时出错\n”;
}否则{
打印“完成!\n”;
}
#将文件保存到临时文件
除非($doc->writeToFileNamed($tmp\u name)==AZ\u OK){
“写入错误”;
}
#必要时更换
如果($replace_文件){
使用文件::复制;
移动($tmp_名称,$docx_名称);
}else{}

其中一个可能对您有所帮助或@harvey:感谢您的链接!它确实在更改属性,但我正在查找其他无法从MS Word修改的属性。下面Haf的答案为我指明了正确的方向。感谢您的指针。帮助我找到了正确的解决方案。