从 ansible 运行 powershell 脚本并注册输出

2024-03-05

我正在尝试运行一个 Powershell 脚本,该脚本在远程 Windows PC 上使用 ansible 从 MSI 文件读取 ProductGUID。 powershell 在本地工作台上作为 ps1 文件运行。但从 ansible 中它会抛出一个错误,指出对象引用未设置为对象的实例。

这是我的ansible代码

- name: Run PowerShell script to find out Product Code
  ansible.windows.win_powershell:
    script: |
           $windowsInstaller = New-Object -ComObject WindowsInstaller.Installer
           $database = $windowsInstaller.OpenDatabase($msiFilePath, 0)
           $query = 'SELECT Value FROM Property WHERE Property = ''ProductCode'''
           $view = $database.OpenView($query)
           $view.Execute()
           $record = $view.Fetch()

           if ($record) {
                $productGUID = $record.StringData(1)
                echo "Product GUID: $productGUID"
           } else {
                echo "Product GUID not found in the MSI file."
           }

           if ($view) {
                $view.Close()
           }
    parameters:
      msiFilePath: '<Path_to_MSI>'
  register: PS_output
  tags:
    - read_msi

- name: Show PS_output
  debug:
    var: PS_output
  tags:
    - read_msi 

输出显示:

更改:[mb018-windows] => { “改变”:真实, “调试”: [], “错误”: [ { “类别信息”:{ “活动”: ””, "category": "操作已停止", “类别id”:14, "原因": "NullReferenceException", “目标名称”:“”, “目标类型”:“” }, “错误详细信息”:空, “例外”: { “帮助链接”:空, “结果”:-2147467261, “内部异常”:空, "message": "对象引用未设置到对象的实例。", "source": "系统.管理.自动化", “类型”:“System.NullReferenceException” }, "full_qualified_error_id": "System.NullReferenceException", "output": "对象引用未设置到对象的实例。\r\n在第 2 行 char:1\r\n+ $database = $windowsInstaller.OpenDatabase($msiFilePath, 0)\r\n+ ~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~\r\n + CategoryInfo : 操作停止: (:) [], NullReferenceException\r\n + ExcellentQualifiedErrorId : System.NullReferenceException\r\n \r\n", “pipeline_iteration_info”:[], "script_stack_trace": "在 , : 第 2 行", “目标对象”:空 }, { “类别信息”:{ “活动”: ””, "category": "无效操作", “类别id”:7, “原因”:“运行时异常”, “目标名称”:“”, “目标类型”:“” }, “错误详细信息”:空, “例外”: { “帮助链接”:空, “结果”:-2146233087, “内部异常”:空, "message": "您不能对空值表达式调用方法。", "source": "匿名托管的 DynamicMethods 程序集", “类型”:“System.Management.Automation.RuntimeException” }, "full_qualified_error_id": "InvokeMethodOnNull", "output": "您不能在空值表达式上调用方法。\r\n在第 4 行 char:1\r\n+ $view = $database.OpenView($query)\r\n+ ~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\r\n + CategoryInfo : InvalidOperation: (:) [], RuntimeException\r\n + FullQualifiedErrorId : InvokeMethodOnNull\r\n \r\n", “pipeline_iteration_info”:[], "script_stack_trace": "在 , : 第 4 行", “目标对象”:空 },


  • 多变的$msiFilePath未在您的内联 PowerShell 脚本中设置,这使得它的计算结果为$null.

    • Passing $null作为 MSI 文件路径.OpenDatabase() method https://learn.microsoft.com/en-us/windows/win32/msi/installer-opendatabase结果是您看到的(模糊的)错误消息。
  • 虽然你确实通过了msiFilePathAnsible 端的参数,该值将成为PowerShell变量有了这个名字,你必须使用参数声明您的 PowerShell 脚本, 以键值对中的键命名parameters:YAML 部分, 用一个param(...)块,如下图:

...

    script: |
           # DECLARE YOUR PARAMETER(S) HERE.
           # The name(s) must match the ones in the parameters: YAML section.
           param([string] $msiFilePath)

           $windowsInstaller = New-Object -ComObject WindowsInstaller.Installer
           $database = $windowsInstaller.OpenDatabase($msiFilePath, 0)
           $query = 'SELECT Value FROM Property WHERE Property = ''ProductCode'''
           $view = $database.OpenView($query)
           $view.Execute()
           $record = $view.Fetch()

           if ($record) {
                $productGUID = $record.StringData(1)
                echo "Product GUID: $productGUID"
           } else {
                echo "Product GUID not found in the MSI file."
           }

           if ($view) {
                $view.Close()
           }
    parameters:
      msiFilePath: '<Path_to_MSI>'

...

Note:

  • 上述技术显示在文档中的示例ansible.windows.win_powershell module https://docs.ansible.com/ansible/latest/collections/ansible/windows/win_powershell_module.html#examples.

  • 有关声明 PowerShell 脚本和函数参数的更多信息,请参阅的相关部分about_Functions帮助主题 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Functions#functions-with-parameters.

  • 中的键值对的方式parameters:YAML 部分被转换为 PowerShell 参数,类似于基于哈希表的方式飞溅 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Splatting在 PowerShell 内部工作。

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

从 ansible 运行 powershell 脚本并注册输出 的相关文章

随机推荐

  • jquery datepicker年份范围默认值

    JQuery 有一点问题datePicker 我怀疑这只是我忽略或错误的设置问题 如果你看这个简单的小提琴 JSFiddle http jsfiddle net w9fwL 2 您会看到我已经设置了年份范围 因此默认情况下 当您单击输入时
  • 使用 python 脚本在同一选项卡中打开 HTML 文件

    我正在尝试使用 python 脚本打开 HTML 页面 使用以下脚本 文件将在新的浏览器选项卡中打开 我应该如何使其在同一选项卡中打开 import webbrowser import os import urllib chrome pat
  • 有没有办法向管理员用户显示 Django 调试堆栈跟踪页面,即使设置中 DEBUG=False 也是如此?

    场景 我宁愿非技术同事直接通过电子邮件向我发送错误 而不是通过 SSH 进入盒子来检索堆栈跟踪 Django 有没有办法或钩子来做这样的事情 例如 def 500 error happened request psuedocode gt l
  • 如何使用 pd.Grouper 按月对日期进行分组?

    我搜索了 stackoverflow 以了解如何按月对 DateTime 进行分组 由于某种原因 即使在我传递数据帧之后 我仍然收到此错误pd to datetime 类型错误 仅对 DatetimeIndex TimedeltaIndex
  • Django 会话过期?

    从 django 的文档中 我的印象是调用 request session set expiry 300 从一种观点来看 会导致会话在五分钟后过期不活动 但是 这不是我在 django trunk 中遇到的行为 如果我从一个视图调用此方法
  • 如何配置 ckeditor 不将内容换行到

    块中?

    我在用ckeditor http ckeditor com 在我的网站上 让用户更容易输入 HTML 但是 我从 ckeditor 返回的数据包含在 p p 块 这是我不想要的 是否有一些配置设置强制编辑器不将文本换行 将以下内容添加到您的
  • GridLayout(不是GridView)如何均匀拉伸所有子项

    我想要一个 2x2 的网格 里面有一个按钮 这只是 ICS 所以我尝试使用给出的新 GridLayout 这是我的布局的 XML
  • 从 RxJS Observable 中过滤未定义的内容

    是否有特定的习惯用法或实用程序用于过滤undefined从 RxJS 可观察到的 这段代码具有我想要的行为 obs pipe filter x gt x undefined 一些替代方案是 obs pipe filter x gt x fo
  • 脚本的布尔参数

    在 Python 中 我了解如何将 int 和 str 参数添加到脚本中 parser argparse ArgumentParser description Mydescription parser add argument l type
  • Elasticsearch - 每个文档的匹配数

    我使用此查询来搜索字段中出现的短语 query match phrase content my test phrase 我需要计算每个文档的每个短语发生了多少次匹配 如果这可能的话 我考虑过聚合器 但认为它们不满足要求 因为它们会给我整个索
  • 如何在 Nextjs 中切换类并更改 CSS?

    我正在开发一个 Next js 项目 其中菜单打开时显示 p 切换菜单类 我设法做到了这一点 但是当我在 CSS 中添加该类时 它没有考虑这两个类 这是我的代码 成分 import useState from react import st
  • 将不完整的嵌套列表放入矩形 ndarray 中

    在Python 也使用numpy 中 我有一个列表列表的列表 每个列表的长度不同 header1 header2 item1 value1 header1 header2 header3 item2 value2 item3 value3
  • Haskell:最简单的 wai 示例的问题

    我是 Haskell 新手 我正在尝试让 wai 包正常工作 因为我对使用 Haskell 进行 Web 应用程序感兴趣 我尝试从第一个 最简单的例子开始wai http github com snoyberg wai主页 1 LANGUA
  • SQL Server 字符串执行带有输出参数的过程

    如何将输出参数与 String Exec 一起使用 考虑使用 标准 语法进行以下查询 DECLARE testString nvarchar 50 EXEC testProcedure param1 testString OUTPUT SE
  • MSVSP100D.dll 缺少在窗口 8 中与 opencv 2.4.1 配合使用 [已关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有以下场景 我正在尝试在 Wind
  • 使用 Cargo 时如何获得带有调试信息的发布版本?

    以下命令 cargo build 产生一个未优化 build with调试信息 相反 cargo build release 产生一个优化 build without调试信息 有没有一种方法可以产生优化 build with调试信息 我需要
  • Heroku 上的 Radiant 扩展?

    有人有过将 Radiant CMS 扩展实际应用到 Heroku 实例上的经验吗 我尝试删除子模块并将文件添加回来 但运气不太好 Heroku 目前不支持 git 子模块 然而 他们的 优秀的 文档表达了解决这个问题的方法 在这里查看 ht
  • 删除 .svn/pristine 的内容是否安全?

    我正在使用一个大型应用程序 我从我的存储库中签出了该应用程序的大部分内容 svn pristine文件夹 据我了解 原始文件夹包含我的workingCopy目录中的文件副本 话虽如此 删除这些文件可以吗 我真的需要它们吗 我已经备份了文件
  • 如何在 C# 中修改装箱值而不创建新对象?

    如何在 C 中修改装箱值而不创建新对象 例如 如果我有object o 5 我想改变盒装的值5 to 6 我怎样才能做到这一点 The o 6 将在堆上创建一个新对象并将对该对象的引用分配给o 还有其他方法可以更改盒装值吗 你可以自己 拳击
  • 从 ansible 运行 powershell 脚本并注册输出

    我正在尝试运行一个 Powershell 脚本 该脚本在远程 Windows PC 上使用 ansible 从 MSI 文件读取 ProductGUID powershell 在本地工作台上作为 ps1 文件运行 但从 ansible 中它