我知道通过 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为工作提供一个对象。
所以我的问题是,有谁知道如何解决这个问题或知道如何以原始形式重建对象?