【问题标题】:Passing variables and object to start-job将变量和对象传递给 start-job
【发布时间】:2021-07-28 03:47:14
【问题描述】:

我知道通过 start-job 执行的脚本块看不到脚本块之外的变量。要传递变量,请使用 -arguments 参数。那么为什么这行得通(来自 MS 文章):

Start-Job -ScriptBlock { Get-Process -Name $args } -ArgumentList "powershell"

但这不是:

Start-Job -ScriptBlock { Get-aduser $args } -ArgumentList "samaccountname"

当我运行它并收到作业时,我收到以下错误:

Cannot convert 'samaccountname' to the type 'Microsoft.ActiveDirectory.Management.ADUser' required by parameter 'Identity'. Specified method is not supported.

同样的语法在通过 start-job 运行之外仍然有效:

Get-aduser "samaccountname"

最后一条命令是为了向您证明 start-job 脚本块中的语法是正确的。那么为什么该命令在通过 start-job 执行时需要一个 ADUser 对象,而在脚本块之外它会接受一个字符串?

我需要能够通过 start-job 执行命令

【问题讨论】:

  • 我只能想象这是由于您将数组传递给它,或者更具体地说,在使用 -ArgumentList 时传递了 system.object[] 类型的值。当运行Get-ADUser 而不是显式 指定参数时,它默认为使用-Identity 作为位置 参数0 的Parameter Set。这很重要,因为@ 987654332@ 仅接受 4 种类型的值:DistinguishedNameGUID (Object Guid)Security IdentifierSAM Account Name我>。所以...
  • "cmdlet 搜索默认命名上下文或分区以查找对象。如果找到两个或更多对象,则 cmdlet 返回非终止错误。"。这解释了由于您将非预期值传递给它而导致的不那么奇怪的行为。
  • 因此,type-constraining 脚本块中-ArgumentList 传递的参数Start-Job -ScriptBlock { [string]$ar = $args; Get-aduser $ar } -ArgumentList "samaccountname" 或使用Remote Variable of $using:somevariable:$string = 'samaccountname'; Start-Job -ScriptBlock { Get-aduser $using:string } 应该可以工作。
  • @AbrahamZinala 您应该完全将其发布为答案,$args.GetType() 应该足以理解错误,$args[0] 也会给出预期的结果。
  • 我认为这是由于传递了一个数组,所以我在发布之前尝试了 Santiago 所说的内容。当时看起来它不起作用,但我现在再次尝试它并且它起作用了,所以它一定是由于我没有正确阅读的另一个错误。随时将其发布为亚伯拉罕的答案,我会接受。多谢你们。我现在还有一个问题,接下来我会发布(这有两个部分!)

标签: powershell scope arguments


【解决方案1】:

在上面的 cmets 中,这里的所有功劳都归功于亚伯拉罕。他提供了答案,但出于某种原因没有将其作为答案提交,所以我提供这个是为了帮助其他人。

问题在于-Arguments 始终是一个数组,即使您只提供一个值。在我的示例中,它不适用于第二个命令(get-Aduser 之一)是因为我将数组传递给期望字符串的参数。将代码更改为 args[0] 解决了这个问题。

第一个命令有效,因为它的参数接受一个字符串一个数组。

注意:将复杂的 对象 传递给 Start-job 是另一回事,并且有其自身的问题,我将此作为另一个问题提出 here

【讨论】:

    猜你喜欢
    • 2023-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2017-10-08
    • 2021-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多