在单词中查找和更改超链接的Powershell脚本会保存文档并以PDF格式创建新副本

时间:2017-09-25 19:39:15

标签: powershell

我试图弄清楚如何编写一个遍历文件夹的脚本并抓取文件夹中的所有word文档来搜索超链接并将链接更改为另一个链接。然后保存该word文档以及创建它的另一个版本,将其转换为pdf。

如何调整下面的脚本以获取文件夹中的所有单词文档,然后搜索" https://www.yahoo.com"的所有超链接。到" https://www.google.com"。一些如何循环遍历整个文档搜索所有超链接。保存该文档,然后转换并提供新的pdf。

这可能吗?

到目前为止我有什么

?actionBarSize

我是PowerShell的新手,有人请帮助我完成这些步骤。我听说powershell可能是最好和最强的语言来完成这种事情。

1 个答案:

答案 0 :(得分:4)

Hadn之前没有这样做过,所以很清楚这一点。我们今天都要学习!你非常接近。只需要一些调整和循环来处理多个文件。我确信有更多知识渊博的人会参与其中,但这可以让你获得理想的结果。

$NewDomain1 = "google"
$NewDomain2 = "hij"
$OurDocuments = Get-ChildItem -Path "C:\Apps\testing" -Filter "*.doc*" -Recurse

$Word = New-Object -ComObject word.application
$Word.Visible = $false

$OurDocuments | ForEach-Object {
    $Document = $Word.documents.open($_.FullName)
    "Processing file: {0}" -f $Document.FullName
    $Document.Hyperlinks | ForEach-Object {
        if ($_.Address -like "https://www.yahoo.com/*") {
            $NewAddress = $_.Address -Replace "yahoo","google"
            "Updating {0} to {1}" -f $_.Address,$NewAddress
            $_.Address = $_.TextToDisplay = $NewAddress
        } elseif ($_.Address -like "http://def.com/*") {
            $NewAddress = $_.Address -Replace "def","hij"
            "Updating {0} to {1}" -f $_.Address,$NewAddress
            $_.Address = $_.TextToDisplay = $NewAddress
        }
    }

    "Saving changes to {0}" -f $Document.Fullname
    $Document.Save()    

    $Pdf = $Document.FullName -replace $_.Extension, '.pdf'
    "Saving document {0} as PDF {1}" -f $Document.Fullname,$Pdf
    $Document.ExportAsFixedFormat($Pdf,17)

    "Completed processing {0} `r`n" -f $Document.Fullname
    $Document.Close()
}

$Word.Quit()

让我们来看看......

我们首先将您的新地址移动到几个变量中,以便于将来引用和更改。您还可以在此处添加您要查找的地址,并根据需要替换硬编码的字符串。第三行使用过滤器来获取目录中的所有.DOC和.DOCX文件,我们将使用它们进行迭代。就个人而言,我会小心使用-Recurse开关,因为您冒着对目录结构中更深层文件进行意外更改的风险。

$NewAddress1 = "https://www.google.com/"
$NewAddress2 = "http://hij.com/"
$OurDocuments = Get-ChildItem -Path "C:\Apps\testing" -Filter "*.doc*" -Recurse

实例化我们的Word Com对象并将其隐藏起来。

$Word = New-Object -ComObject word.application
$Word.Visible = $false

加入我们的ForEach-Object循环......

对于我们在$OurDocuments中收集的每个文档,我们打开它并将任何超链接传递到另一个ForEach-Object,我们在其中检查Address属性的值。如果我们想要匹配,我们使用新值更新属性。您会注意到我们还在更新TextToDisplay媒体资源。这是您在文档中看到的文本,而不是控制超链接实际位置的Address

这...... $_.Address = $_.TextToDisplay = $NewAddress1 ...是多变量赋值的一个例子。由于AddressTextToDisplay将设置为相同的值,我们会同时分配它们。

$Document = $Word.documents.open($_.FullName)
"Processing file: {0}" -f $Document.FullName
$Document.Hyperlinks | ForEach-Object {
    if ($_.Address -like "https://www.yahoo.com/*") {
        $NewAddress = $_.Address -Replace "yahoo","google"
        "Updating {0} to {1}" -f $_.Address,$NewAddress
        $_.Address = $_.TextToDisplay = $NewAddress
    } elseif ($_.Address -like "http://def.com/*") {
        $NewAddress = $_.Address -Replace "def","hij"
        "Updating {0} to {1}" -f $_.Address,$NewAddress
        $_.Address = $_.TextToDisplay = $NewAddress
    }
}

保存所做的任何更改......

"Saving changes to {0}" -f $Document.Fullname
$Document.Save()    

这里我们为保存为PDF时创建新文件名。请注意我们第一行中的$_.Extension。我们切换到使用管道对象来引用文件扩展名,因为当前管道对象仍然是Get-ChildItem的文件信息对象。由于$Document对象没有扩展属性,因此您必须对文件名进行一些切片才能获得相同的结果。

$Pdf = $Document.FullName -replace $_.Extension, '.pdf'
"Saving document {0} as PDF {1}" -f $Document.Fullname,$Pdf
$Document.ExportAsFixedFormat($Pdf,17)

关闭文档,循环将移至$OurDocuments中的下一个文件。

"Completed processing {0} `r`n" -f $Document.Fullname
$Document.Close()

一旦我们浏览了所有文件,我们就会关闭Word。

$Word.Quit()

我希望一切都有意义!