【发布时间】:2013-06-30 10:42:23
【问题描述】:
我构建了一个将.doc 文件转换为.docx 的脚本。
我有一个问题,当.doc 文件受密码保护时,我无法访问它,然后脚本挂起。
我正在寻找一种在打开文件之前检查文件是否有密码的方法。
我使用Documents.Open方法打开文件。
【问题讨论】:
标签: powershell ms-word passwords docx doc
我构建了一个将.doc 文件转换为.docx 的脚本。
我有一个问题,当.doc 文件受密码保护时,我无法访问它,然后脚本挂起。
我正在寻找一种在打开文件之前检查文件是否有密码的方法。
我使用Documents.Open方法打开文件。
【问题讨论】:
标签: powershell ms-word passwords docx doc
如果您的脚本在打开文档时挂起,this question 中概述的方法可能会有所帮助,只是在 PowerShell 中您将使用 try..catch 块而不是 On Error Resume Next:
$filename = "C:\path\to\your.doc"
$wd = New-Object -COM "Word.Application"
try {
$doc = $wd.Documents.Open($filename, $null, $null, $null, "")
} catch {
Write-Host "$filename is password-protected!"
}
如果可以打开文件,但内容受到保护,可以这样判断:
if ( $doc.ProtectionType -ne -1 ) {
Write-Host ($doc.Name + " is password-protected.")
$doc.Close()
}
如果这些都不起作用,您可能不得不求助于this answer 中描述的方法。粗略翻译为 PowerShell(检测加密文档的那些部分):
$bytes = [System.IO.File]::ReadAllBytes($filename)
$prefix = [System.Text.Encoding]::Default.GetString($bytes[1..2]);
if ($prefix -eq "ÐÏ") {
# DOC 2005
if ($bytes[0x20c] -eq 0x13) { $encrypted = $true }
# DOC/XLS 2007+
$start = [System.Text.Encoding]::Default.GetString($bytes[0..2000]).Replace("\0", " ")
if ($start -like "*E n c r y p t e d P a c k a g e") { $encrypted = $true }
}
【讨论】:
if ($bytes[0x20c] == 0x13) { $encrypted = $true }。 .doc 支持呢?
here 概述了一种技术。本质上,您提供了一个假密码,没有密码的文件将被忽略;然后你错误地捕获那些需要密码的,并且可以跳过它们。
【讨论】: