Я не понимаю, как удалить эту строчку в xml файле с помощью Powershell.


Задача состоит в том, чтобы взять защищенный паролем файл .docx и удалить пароль. Код работает следующим образом.

  1. Полный путь к файлу документа, включая расширение, вводится техническим специалистом.
  2. Код проверяет путь и расширение документа, чтобы убедиться в их правильности.
  3. Копирует документ в общую папку и меняет расширение на .zip.
  4. Затем файл распаковывается.
  5. После распаковки он получает содержимое файла settings.xml, находящегося в папке Word.
  6. Вот где у меня проблемы. Моя цель - удалить пароль из файла settings.xml.
  7. После удаления пароля мне нужно повторно заархивировать все разархивированные файлы и изменить расширение обратно на .docx.

Вот скрипт Powershell, вставленный ниже:

function CrackIt
{
write-host = "Please enter the full file path including the extension.  (example:  C:\Users\Public\filname.docx)"
$filepath = read-host "Filepath  "


$ResultTest = test-path $filepath

#gets the extension of the file
$extension = [System.IO.Path]::GetExtension($filepath)

#tests path
if(($ResultTest -eq $False))
{
    write-host "Invalid Filepath"
}

else
{

    if($extension -eq ".docx")
    {
        #copies file to public folder and changes extension to .zip
         $newpath = Copy-Item -Path $filepath –Destination ([io.path]::ChangeExtension($filepath, '.zip')) -Verbose -PassThru -ErrorAction SilentlyContinue
         Unzip "$newpath" "C:\Users\Public\Documents"  #unzips the file

         #Here's where I am trying to remove the password.

         $File = 'C:\Users\Public\Documents\word\settings.xml'
         [xml]$xml = Get-Content $File
         $xml | Select-Xml -XPath '//w:documentProtection' | Foreach{$_.Node.ParentNode.RemoveChild($_.Node)}
         $xml.Save($File)
else
    {

        write-host "File type not supported.  If possible, please save the document in either a .docx or .xlsx format.  If it is not possible, oh well."

    }



}

А вот и содержимое xml файла.












































Rob

Ответов: 2

Ответы (2)

Один из вариантов - загрузить содержимое файла в виде строки, удалить фрагмент с помощью оператора -replace и затем преобразовать в xml. Что-то вроде:

$xmlString = (Get-Content $File) -replace "`r`n", ""
$xml = [xml]''
$xml.LoadXml($xmlString)

Вы должны ссылаться и использовать пространство имен «http://schemas.openxmlformats.org/wordprocessingml/2006/main», которое является членом:

$xml `
| Select-Xml -XPath '//w:documentProtection' -Namespace @{w = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"} `
| Foreach{$_.Node.ParentNode.RemoveChild($_.Node)}

2022 WebDevInsider