Powershell 脚本查找并更改 Word 中的超链接,保存文档并创建 PDF 格式的新副本

2024-02-13

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

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

这可能吗?

到目前为止我所拥有的

    $word = New-Object -ComObject word.application
        $document = $word.documents.open("path to folder")
        $hyperlinks = @($document.Hyperlinks) 
        $hyperlinks | ForEach {
            $newURI = ([uri]$_.address).AbsoluteUri
            Write-Verbose ("Updating {0} to {1}" -f $_.Address,$newURI) -Verbose
            $_.address = $newURI
        }
        If (_$.address -eq "https://www.yahoo.com/") {
            $_.Address = "https://www.google.com/"
        } ElseIf ($_.Address -eq "http://def.com/motorists") {
            $_.Address = "http://hij.com/"
        }
        $document.save()
        $word.quit()

    Get-ChildItem -Path $document -Include *.doc, *.docx -Recurse |
        ForEach-Object {
            $doc = $word.Documents.Open($_.Fullname)
            $pdf = $_.FullName -replace $_.Extension, '.pdf'
            $doc.ExportAsFixedFormat($pdf,17)
            $doc.Close()
        }
    $word.Quit()

我是 powershell 新手,请有人帮助我完成这些步骤。我听说 powershell 可能是完成此类任务的最好、最强大的语言。


以前没有这样做过,所以很高兴弄清楚。今天我们俩都要学习!你们非常亲密。只需进行一些调整和一个循环来处理多个文件。我确信会有更有知识的人过来,但这应该会给你带来想要的结果。

$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 loop...

对于我们收集的每份文档$OurDocuments,我们打开它并将所有超链接通过管道传输到另一个ForEach-Object,我们检查的值Address财产。如果存在我们想要的匹配项,我们将使用新值更新属性。您会注意到我们也在更新TextToDisplay财产。这是您在文档中看到的文本,而不是Address它控制超链接的实际去向。

This... $_.Address = $_.TextToDisplay = $NewAddress1...是多变量分配的一个例子。自从Address and TextToDisplay将被设置为相同的值,我们将同时分配它们。

$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()

我希望一切都有意义!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Powershell 脚本查找并更改 Word 中的超链接,保存文档并创建 PDF 格式的新副本 的相关文章

随机推荐

  • 在 Android 中使用 Path.arcTo() 绘制圆环时的奇怪行为

    我已经成功地从 0 到 360 度的角度开始扫动 实现了一个动画绘图环 然而 当环尾部以 360 度角与头部相遇时 所有绘图都消失了 这是我的戒指代码onDraw float startAngle 270 float sweepAngle
  • 单击图像上的工具提示

    我有一张桌子 上面有 thead 和 th s 在每个里面我都有一个形状问号 的图像 我想在单击每个帮助图像时显示帮助 工具提示 这个怎么做 请建议 我会使用一个插件 Tooltip http bassistance de jquery p
  • 如何隐藏html div

    我正在用 Ruby On Rails 开发一个小型应用程序 我想隐藏 html erb 文件中的 div 直到单击链接 最简单的方法是什么 在你的 html 文件中 a href Show Whatever a div class hidd
  • JavaScript 不显示在网页上?

    div div
  • 如何使用通配符路径规范从分支检出文件?

    我无法使用通配符签出文件 如git scm 页面 https git scm com docs gitglossary html def pathspec 来自特定的 refspec 用一个例子来描述这个问题 使用 java 和 c 文件创
  • 如何在自引用外键中使用现有查询引用所有子对象?

    我有一个代表所有者的模型 该模型自身有一个外键来表示父实体 还有另一种模型 称为具有所有者外键的资产 母公司外键的目的是模拟公司结构 以便母公司 拥有 外键为其自身或子公司的资产 Class Owner models Model paren
  • 实现自己的memcpy(大小以字节为单位?)

    我最近遇到一个面试问题 我必须实现 memcpy 根据我的经验 我已经使用过很多memcpy 所以这似乎不是一个棘手的问题 因此 我开始实现一个循环 一次从一个指针复制一个地址到另一个指针 如下所示 void memcpy void des
  • Android 11:如何/在哪里写入应在卸载后仍然存在的混合媒体文件

    我正在编写一个针对 Android 11 的特定用例相机应用程序 当我点击记录时 我想在某处创建一个新目录 名称基于时间戳等 其中包含生成的视频以及整个堆其他也在录制过程中写入的自定义 YAML JSON CSV 文件 逻辑上属于录制的 输
  • iPhone/iOS JSON解析教程[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 作为一次学习经验 我想制作一个 iPhone 应用程序 该应用程序调用 Web 服务器 Web 服务 检索 JSON 响应 并使用该响应来
  • 在 Egit (Eclipse) 中更改用户位置(主变量)

    我使用 Eclipse Indigo 和 Windows 7 以及 Eclipse 插件 egit jgit 如何更改 egit 中的用户位置 我应该这样做 因为它包含特殊字符 它不理解 egit 我想要 C git home gitcon
  • 主要在命名空间中

    为什么这个不能编译 链接器找不到main 但是为什么会这样呢 namespace somenamespace int main void return 0 3 6 1 1 程序应包含一个名为 main 的全局函数 哪个 是指定的开始 程序
  • 如何在Ubuntu上使用gem安装Rails

    错误信息 Building native extensions This could take a while ERROR Error installing rails ERROR Failed to build gem native ex
  • intellij 构建包含 gradle 依赖项的 jar 工件

    我基本上想做一些简单的事情 或者至少我认为它应该非常简单 我的目标是创建一个 Intellij gradle 项目 使用 gradle 向模块添加一些依赖项 并向其中添加一些 java 源代码 然后我只想有一个选项以某种方式将整个东西编译成
  • 如何使用包database/sql批处理sql语句

    如何使用Go的database sql包批处理sql语句 在Java中我会这样做 Create a prepared statement String sql INSERT INTO my table VALUES PreparedStat
  • Dagger 和 libgdx

    可以使用 dagger 2 和 libgdx web 吗 libgdx 项目可以在 Android 和桌面上正常构建 当我添加一个网络模块并运行时 gradlew html superDev ERROR Line 1 The type ja
  • 您可以在不使用 API 的情况下获得 MailChimp 兴趣组 ID 吗?

    使用 MailChimp API 要将成员添加到具有特定兴趣组的列表 您需要该列表的 ID 和兴趣组的 ID 要获取这两个 ID 您可以查询 API 来获取它们 或者对于列表 ID 您可以在 MailChimp 接口输出的表单代码中找到它
  • JSTL中如何获取随机数?

    我想要得到类似于 JSTL 中生成的下一个代码的内容
  • 当无法访问服务器时,PHP 的 PDO 会忽略 MySQL 的 ATTR_TIMEOUT 选项

    我正在测试无法通过输入随机 IP 尝试连接来访问 mysql 服务器的场景 我将 PDO 的选项设置为在一秒后超时PDO ATTR TIMEOUT gt 1 然而 抛出异常仍然需要30秒 我猜这个超时仅适用于实际的 mysql 连接时间 而
  • HTML5 应用程序缓存相关吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Powershell 脚本查找并更改 Word 中的超链接,保存文档并创建 PDF 格式的新副本

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