You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

批量移除.dotx文件密码:PowerShell脚本运行无效求助

解决PowerShell移除.dotx模板密码无效的问题

你的脚本运行无警告但密码未移除,核心问题在于**.dotx是Word模板文件,直接设置Password为null后用Close保存的方式不适用模板**,需要通过SaveAs方法明确指定保存类型并清除所有密码属性。另外原脚本路径变量存在多余引号,也需要修正。

关键问题分析

  1. 路径变量多了嵌套引号:原代码$path = '"path folder with dotx files"'会导致路径解析异常,需去掉内层引号。
  2. 模板文件保存逻辑错误:Word模板需要通过SaveAs方法指定模板格式,仅设置Password为null并调用Close无法正确写入无密码的模板文件。
  3. 未处理写密码:部分模板可能同时设置了读密码和写密码,需同时清除WritePassword。

修正后的脚本

$path    = 'C:\Your\Dotx\Files\Folder'  # 替换为实际文件夹路径,不要嵌套引号
$passwd  = 'pASSWORD'
$counter = 0
$WordObj = New-Object -ComObject Word.Application
$WordObj.Visible = $false

# 定义Word常量(若系统未自动加载,手动指定)
$wdFormatXMLTemplate = 14
$wdSaveChanges = -1

# 获取所有.dotx文件
$documentFiles = @(Get-ChildItem -Path $path -Filter '*.dotx' -File)
foreach ($file in $documentFiles) {
    try {
        # 打开模板文件,同时传入读密码和写密码(如果模板设置了写密码)
        $WordDoc = $WordObj.Documents.Open(
            $file.FullName,
            $null,  # ConfirmConversions
            $false, # ReadOnly:设为false才能修改
            $null,  # AddToRecentFiles
            $passwd, # PasswordDocument
            $passwd, # PasswordTemplate
            $null,  # Revert
            $passwd, # WritePasswordDocument
            $passwd  # WritePasswordTemplate
        )
        
        # 清除所有密码属性
        $WordDoc.Password = $null
        $WordDoc.WritePassword = $null
        
        # 用SaveAs覆盖原文件,指定模板格式
        $WordDoc.SaveAs(
            $file.FullName,
            $wdFormatXMLTemplate,
            $null, # LockComments
            $null, # Password
            $false, # AddToRecentFiles
            $null, # WritePassword
            $false, # ReadOnlyRecommended
            $null, # EmbedTrueTypeFonts
            $false, # SaveNativePictureFormat
            $false, # SaveFormsData
            $false, # SaveAsAOCELetter
            $wdFormatXMLTemplate # 再次指定格式确保正确
        )
        
        $WordDoc.Close($wdSaveChanges)
        $counter++
    }
    catch {
        Write-Warning "无法打开文件 $($file.FullName):`r`n$($_.Exception.Message)"
        # 确保出错时关闭文档,避免进程残留
        if ($WordDoc) {
            $WordDoc.Close(0) # 0=wdDoNotSaveChanges
        }
    }
}

# 释放COM对象,关闭Word进程
$WordObj.Quit()
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($WordDoc) | Out-Null
[System.Runtime.Interopservices.Marshal]::ReleaseComObject($WordObj) | Out-Null
[System.GC]::Collect()
[System.GC]::WaitForPendingFinalizers()

Write-Host "处理完成:共 $($documentFiles.Count) 个文件,成功处理 $counter 个"

注意事项

  • 替换$path为你的实际文件夹路径,确保路径无嵌套引号。
  • 如果部分模板仅设置了读密码,可保留WritePasswordDocument和WritePasswordTemplate参数为$null,但统一传入密码兼容性更好。
  • 脚本运行时需确保没有其他Word进程占用目标文件,否则会报错。

内容的提问来源于stack exchange,提问作者Yad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:03:34