在尝试简化从Word转换为PDF的PowerShell脚本时,我发现了以下奇怪的场景让我大吃一惊。这是来自概念验证互动会话的成绩单:
Windows PowerShell
Copyright (C) 2016 Microsoft Corporation. All rights reserved.
PS C:\Users\Frag> Add-Type -AssemblyName Microsoft.Office.Interop.Word
PS C:\Users\Frag> $word = New-Object -ComObject Word.Application
PS C:\Users\Frag> $i = Get-Item ".\document.docx"
PS C:\Users\Frag> $i.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True FileInfo System.IO.FileSystemInfo
PS C:\Users\Frag> $i.FullName
C:\Users\Frag\document.docx
PS C:\Users\Frag> $doc = $word.Documents.Open($i.FullName)
PS C:\Users\Frag> $doc.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True False DocumentClass System.__ComObject
PS C:\Users\Frag> $good = $i.FullName.Remove($i.FullName.Length - $i.Extension.Length) + ".pdf"
PS C:\Users\Frag> $bad = Join-Path $i.DirectoryName ($i.BaseName + ".pdf")
PS C:\Users\Frag> $good
C:\Users\Frag\document.pdf
PS C:\Users\Frag> $bad
C:\Users\Frag\document.pdf
PS C:\Users\Frag> $good -eq $bad
True
PS C:\Users\Frag> $good.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
PS C:\Users\Frag> $bad.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
PS C:\Users\Frag> Remove-Item -LiteralPath $good -Force -ErrorAction SilentlyContinue
PS C:\Users\Frag> $doc.SaveAs($good, [Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatPDF)
PS C:\Users\Frag> dir $good
Directory: C:\Users\Frag
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 11/03/2017 22:50 174616 document.pdf
PS C:\Users\Frag> Remove-Item -LiteralPath $good -Force
PS C:\Users\Frag> $doc.SaveAs($bad, [Microsoft.Office.Interop.Word.WdSaveFormat]::wdFormatPDF)
最后一个命令挂起,必须关闭shell窗口以及从任务管理器中杀死的不可见Word实例。
根据它的外观,$good
和$bad
似乎是不同的字符串类型。有谁知道这里发生了什么?
我设法通过添加明确的演员来解决问题:
PS C:\Users\Frag> [string]$bad = Join-Path $i.DirectoryName ($i.BaseName + ".pdf")
所以问题已经消失,但我仍然非常感谢解释或指针。
答案 0 :(得分:0)
type
为我工作...