批量移除.dotx文件密码:PowerShell脚本运行无效求助
解决PowerShell移除.dotx模板密码无效的问题
你的脚本运行无警告但密码未移除,核心问题在于**.dotx是Word模板文件,直接设置Password为null后用Close保存的方式不适用模板**,需要通过SaveAs方法明确指定保存类型并清除所有密码属性。另外原脚本路径变量存在多余引号,也需要修正。
关键问题分析
- 路径变量多了嵌套引号:原代码
$path = '"path folder with dotx files"'会导致路径解析异常,需去掉内层引号。 - 模板文件保存逻辑错误:Word模板需要通过
SaveAs方法指定模板格式,仅设置Password为null并调用Close无法正确写入无密码的模板文件。 - 未处理写密码:部分模板可能同时设置了读密码和写密码,需同时清除
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
相关产品推荐
相关产品推荐

