【发布时间】: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 种类型的值:DistinguishedName、GUID (Object Guid)、Security Identifier 和 SAM 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