PowerShell - 将对象传递给启动作业 - 反序列化

2024-01-11

我知道通过 start-job 执行的脚本块无法看到脚本块之外的变量。要传递变量,请使用-arguments范围。从我读过的 doco 来看,作业不能在没有连载 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_jobs?view=powershell-7.1他们。显然这是因为工作的工作方式 - 使用时Start-job,PowerShell 创建一个新进程并在那里运行命令;为了将对象传输到另一个进程,它需要将其序列化,然后另一个 exe 在导入时将其反序列化。当您想在启动作业中使用对象时,这会带来问题。

NOTE:下面是演示我的问题的示例 - 我运行的实际 cmdlet 和脚本完全不同且更复杂,因此,如果您想知道为什么我会以这种方式运行这些命令,请记住我不会,他们只是简单的命令来演示我的问题。

以下是我用于简单 Get-aduser 命令的语法示例

$user = get-aduser samaccount

当我们输出 $user 时,我们看到该对象的类型ADUser

$user|GM
TypeName: Microsoft.ActiveDirectory.Management.ADUser

现在让我们序列化该对象(以模拟 start-job 的作用)

$user| Export-Clixml C:\temp\test.xml

现在重建它(反序列化)

$user = Import-Clixml C:\temp\test.xml

现在,当我们查看它的类型时,它是不同的。它前面有“反序列化”一词。

 $user|GM
TypeName: Deserialized.Microsoft.ActiveDirectory.Management.ADUser

我现在遇到的问题是它不是原始对象的真实表示。即使所有属性和设置都相同,我们仍然存在对象类型不同的问题。现在来演示为什么这是一个问题。

Get-aduser接受一个字符串作为输入(第一个示例),但它也将接受一个有效的ADuser目的。但是当我们现在运行时:

get-aduser $user

我们得到以下错误:

"Cannot convert the "AD_distinguishedname_here. I have omitted this for security reasons" value of type 
"Deserialized.Microsoft.ActiveDirectory.Management.ADUser" to type "Microsoft.ActiveDirectory.Management.ADUser"."

此错误是因为 Get-aduser 希望您提供类型的对象Microsoft.ActiveDirectory.Management.ADUser但我们提供了Deserialized.Microsoft.ActiveDirectory.Management.ADUser并且它不知道如何转换它。这正是您通过 start-job 运行命令时发生的情况以及无法将对象传递给作业的原因。

正如我上面所说,我没有在实际代码中使用 get-aduser,我只是使用每个人都可以访问的这个简单命令来演示该问题。在我的真实代码中我must为工作提供一个对象。

所以我的问题是,有谁知道如何解决这个问题或知道如何以原始形式重建对象?


在这条直线上花了 8 个小时后,我终于弄清楚发生了什么。这是一个很长的故事,但总而言之,您无法使用任何本机工具来解决这个问题 - 您必须在启动作业脚本块内重建对象,如果您有一个大型复杂对象,这是不可行的。我最终找到了一个可以下载的模块,它通过启动线程而不是启动作业运行命令,并且不使用序列化。指南在这里 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_thread_jobs?view=powershell-7.1到DL并安装它。当我测试它时这有效

要获取 PowerShell 模块,请转到 PowerShell 库并搜索“start-thread”

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

PowerShell - 将对象传递给启动作业 - 反序列化 的相关文章

  • Python 中 `if name == "__main__"` 是什么意思? [复制]

    这个问题在这里已经有答案了 可能的重复 name main gt 做什么 https stackoverflow com questions 419163 what does if name main do 我已经用 Python 编写脚本
  • 非静态类中的静态方法有什么意义?

    我无法理解以下代码的潜在错误 class myClass public void print string mess Console WriteLine mess class myOtherClass public static void
  • 根据字符串列表查找第一个可用的序列号?

    给定一个字符串列表 例如 apple01 apple02 and apple04 banana02 cherry01 你会如何想出first可用序列号each类型 也就是说 apple03如果我问apple or banana01如果我问b
  • powershell 将文件添加到 zip

    我正在尝试使用 powershell 将文件添加到 zip 文件 我可以创建 zip 文件 但无法弄清楚如何将我的文件添加到其中 我在用着 zipfilename c cwRsync backup zip file c cwRsync ba
  • Powershell:如何获取从 PsJob 内运行的进程返回的退出代码?

    我在 powershell 中有以下工作 job start job c utils MyToolReturningSomeExitCode cmd ArgumentList JobFile 如何访问返回的退出代码c utils MyToo
  • 带有 UiPath 的 Powershell

    我正在使用 UiPath 启动 PowerShell 脚本 我需要从 UiPath 传递一个参数 首先这可能吗 其次有人有这方面的例子吗 不确定 PowerShell 脚本中的语法是什么 是否可以将参数从 UiPath 传递到终端 您的 P
  • 使用Powershell访问远程Oracle数据库

    我需要能够连接到我的网络上基于 Windows 7 的 Oracle 服务器 32 位 Oracle XE 我需要连接的机器运行 Windows 7 64 位 两台机器上都安装了 Powershell 我已在 64 位计算机上安装了 Ora
  • 检查文件是否存在,然后移动它

    我正在尝试在 powershell 中编写几行代码 以检查文件是否到达特定文件夹 如果该文件存在 请将其复制到另一个文件夹 如果该文件不存在 则无需执行任何操作 到目前为止我只有复制部分 cd C Move y C myfolder csv
  • 在 React 应用程序的 shell 脚本中设置环境变量

    我正在尝试在 powershell 和 bash 脚本中设置一些环境变量 并在 ReactJS 应用程序中读取它们 shell脚本很简单 env AUTHDOMAIN some domain com env AUTHCLIENTID bun
  • 在 Windows 上不使用 OpenSSL 从 pfx 文件或证书存储中提取私钥

    正如标题所示 我想在不使用 OpenSSL 或任何其他第三方工具的情况下导出我的私钥 如果我需要一个 cer文件或 pfx我可以通过 MMC 或 PowerShell 轻松导出这些文件pkiclient但我找不到获取私钥的方法 https
  • 对 CSV 文件中的列进行分组并连接另一列的值

    我刚刚开始使用 PowerShell 在任何地方都找不到这个问题的答案 尝试编写一个脚本来导入 CSV 文件并搜索该文件以查看是否有任何名称相同 如果名称相同 我想将所有这些值写在同一行上 并且只显示名称一次 例如 Name Number
  • 引用同一 PSCustomObject 的另一个属性

    我有一个PSCustomObject已声明并且它有多个成员 其中一些需要互相参考 例如 data PSCustomObject a x b y c z d a b c 我所期望的是 data d回来 x y z 我尝试通过以下方式引用其他属
  • 在 PowerShell 中从文件名中删除路径和扩展名

    我有一系列字符串 它们是文件的完整路径 我想只保存文件名 不保存文件扩展名和主路径 所以由此可知 c temp myfile txt to myfile 我实际上并没有遍历目录 在这种情况下类似于 PowerShell 的目录basenam
  • 如何序列化/反序列化自定义数据集

    我有一个 winforms 应用程序 它使用强类型的自定义数据集来保存数据进行处理 它由数据库中的数据填充 我有一个用户控件 它接受任何自定义数据集并在数据网格中显示内容 这用于测试和调试 为了使控件可重用 我将自定义数据集视为普通的 Sy
  • 如何将 PowerShell cmdlet 或函数添加到我的计算机以使其始终可用?

    如果我找到 或创建 新的 PowerShell cmdlet 或函数 如何将其添加到我的计算机 我是否将其复制到特定文件夹 我是否将其内容放入特定文件中 我是否需要授权 签名或以某种方式给予许可 我不想只在一次会话中使用它 我希望每当我在此
  • 模块函数中使用的 $_ 变量为空 (PowerShell)

    这里有一个问题要问你 我有这个功能 function Set DbFile param Parameter ValueFromPipeline true System IO FileInfo InputObject Parameter Va
  • PowerShell,如何增加变量名称?

    我目前正在编写一个解析 XML 文件的 PowerShell 脚本 它将一些解析的值保存为变量以供以后使用 例如 假设我的 XML 如下所示
  • 从文本文件中删除行(如果其开头为)

    我有包含无效记录的大型文本文件 我想删除第一个字段为空白的所有行 文件分隔符是波浪号 所以本质上我想删除第一个字符为 的所有行 有人可以协助编写 PowerShell 代码吗 我似乎无法正确理解 只需添加我评论中的答案部分作为答案 以便人们
  • 如何在 WiX 中启动 PowerShell 并正确访问 Windows 注册表?

    Update 有趣的是 如果我运行 32 位 powershell 来运行脚本 它会给我同样的错误 看起来32位powershell无法访问64位注册表树 我尝试使用WixQuietExec64但它给出了同样的错误 我还尝试提供 power
  • 区分注册表项和值路径

    是否有相当于 System IO DirectoryInfo and System IO FileInfo 用于区分注册表项和值 我想评估一条路径并为用户记录该路径的最终目标是什么 到目前为止 这就是我所拥有的 而且有点丑陋 path Re

随机推荐