excel 在PowerShell伊势中运行正常的VS代码中运行PowerShell脚本时出错

evrscar2  于 2023-10-21  发布在  Shell
关注(0)|答案(2)|浏览(151)

我有一个简单的脚本,获取.csv文件并对其进行一些更改,然后保存该文件作为Excel工作簿,当我在PowerShell伊势中运行它时,所有工作正常,但在VS Code中我得到以下错误:

  1. InvalidOperation: C:\Path\CSV Script v2.ps1:80:41
  2. Line |
  3. 80 | Objects.Add([Microsoft.Office.Interop.Excel.XlListObjectSourceType]::
  4. | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  5. | Unable to find type [Microsoft.Office.Interop.Excel.XlListObjectSourceType].
  6. InvalidOperation: C:\Path\CSV Script v2.ps1:83:5

当我尝试在脚本中执行以下操作时,会出现错误:

  1. # Convert the data range to a table
  2. $table = $worksheet.ListObjects.Add(
  3. [Microsoft.Office.Interop.Excel.XlListObjectSourceType]::xlSrcRange,
  4. $dataRange,
  5. $null,
  6. [Microsoft.Office.Interop.Excel.XlYesNoGuess]::xlYes
  7. )
  8. # Name the table as the worksheet name
  9. $table.Name = $worksheet.Name

我已经尝试了多种方法来解决VS代码中的问题,但似乎没有任何帮助,我真的很想找出为什么会发生这个问题。
任何帮助将不胜感激
谢谢
斯坦
我在网上找到了一些相关信息后,尝试在脚本开始时以多种方式加载互操作excel对象,但这并不是我遇到的问题,而且我还尝试了许多其他方法。

wmvff8tz

wmvff8tz1#

tl;dr

使用以下命令也在PowerShell (Core) 7+中加载Microsoft.Office.InterOp.Excel程序集(的最新版本),以便您可以在脚本中使用[Microsoft.Office.Interop.Excel.XlListObjectSourceType]等类型:

  1. Add-Type -ErrorAction Stop -LiteralPath (
  2. Get-ChildItem $env:WinDir\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\*\Microsoft.Office.Interop.Excel.dll |
  3. Sort-Object { [version] ($_.Directory.Name -replace '_.*') }
  4. )[-1].FullName

要在给定计算机上找出文本路径(将是特定于版本的),请打开 Windows PowerShellpowershell.exe)会话并运行:
Add-Type -AssemblyName Microsoft.Office.InterOp.Excel; [Microsoft.Office.Interop.Excel.Application].Assembly.Location;例如,对于Microsoft Office 2019,这会产生以下结果;虽然你可以在Add-Type -LiteralPath中使用这个,但请注意,你将锁定特定的版本:

  1. C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0__71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll

Windows PowerShell 不同,在 PowerShell(Core)7+ 中,当您使用New-Object -ComObject Excel.Application时,此程序集既不会 * 隐式 * 加载,也不能通过Add-Type -AssemblyName Microsoft.Office.InterOp.Excelname only 发现

  • 关于Windows PowerShell * 伊势 *:它不再积极开发和there are reasons not to use it(底部部分),特别是无法运行 PowerShell(Core)7+。积极开发的跨平台编辑器提供了最好的PowerShell开发体验,是Visual Studio Code及其PowerShell extension
    重要
  • Microsoft.Office.InterOp.Excel程序集不能 * 保证 * 存在于给定的机器上。
  • 如果它在你正在开发脚本的机器上,你的代码可能会在它不在的机器上中断。

请继续阅读以了解详细信息。
您尝试访问的类型-[Microsoft.Office.Interop.Excel.XlYesNoGuess]-来自Excel PIA(主互操作程序集)Microsoft.Office.InterOp.Excel,它将COM自动化类型 Package 在.NET类型中。
此类皮亚斯:

  • 并不保证安装在给定的机器上。
  • 在PowerShell* 中使用 * 并不严格 * 必需 *:
  • 在 * 缺少 * 相关PIA的情况下,您的代码必须避免引用.NET Package 器类型,例如[Microsoft.Office.Interop.Excel.XlListObjectSourceType][Microsoft.Office.Interop.Excel.XlYesNoGuess],并使用这些枚举类型值的 * 底层数值 *,例如,根据链接文档,1代替[Microsoft.Office.Interop.Excel.XlListObjectSourceType]::xlSrcRange2代替[Microsoft.Office.Interop.Excel.XlYesNoGuess]::xlNo
    注意事项
  • 虽然使用皮亚斯无疑使脚本的 * 开发 * 更容易,包括产生更可读的代码,[1]产生的脚本可能会在没有安装皮亚斯的机器上 * 中断 *。
  • PowerShell甚至在创建COM自动化对象导致 * 隐式 * 使用皮亚斯(在Windows PowerShell中)时提供了一个选择性加入的警告:将-Strict交换机添加到New-Object -ComObject呼叫。
      • 结果**是:
    • 两者之一 *:如上所述,开发脚本 * 时 * 不 * 引用皮亚斯**中的.NET Package 类型,因此它也可以在没有皮亚斯的计算机上运行。
    • :确保所有目标计算机都安装了相关的皮亚斯*。

[1]其他好处是能够 * 发现 *(通过Get-Member)和 * 制表符完成 * 组成Excel对象模型的对象的成员。

展开查看全部
63lcw9qa

63lcw9qa2#

我能够找到正确的add-type命令来输入和加载Microsoft.Office.Interop.Excel.dll。一旦我找到了正确的路径,修复方法是将此添加到脚本的开头:

  1. Add-Type -Path 'C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Excel\15.0.0.0_71e9bce111e9429c\Microsoft.Office.Interop.Excel.dll'

相关问题