如何将参数传递给通过 Start-Job 调用的 PS 脚本?

How to pass parameters to a PS script invoked through Start-Job?

我想使用 start-job 来 运行 一个需要参数的 .ps1 脚本。这是脚本文件:

#Test-Job.ps1 
Param (
[Parameter(Mandatory=$True)][String]$input
)

$output = "$input to output"

return $output

这就是我如何 运行宁它:

$input = "input"
Start-Job -FilePath 'C:\PowerShell\test_job.ps1' -ArgumentList $input -Name "TestJob"
Get-Job -name "TestJob" | Wait-Job | Receive-Job
Get-Job -name "TestJob" | Remove-Job

运行这样,它returns“输出”,所以在作业运行的脚本中$input为null。

我看过其他类似的问题,但他们大多使用 -Scriptblock 代替 -FilePath。通过 Start-Job 向文件传递参数有不同的方法吗?

tl;dr

  • $input 是一个 自动变量 (由 PowerShell 提供的值),不应用作自定义变量。

  • 只需将 $input 重命名为 $InputObject 即可解决您的问题。


因为 Lee_Dailey notes, $input is an automatic variable 不应分配给 (它由 PowerShell 自动管理以提供非管道输入的枚举器高级脚本和函数)。

遗憾又意外的是,几个自动变量,包括$input可以赋值给:见.

$input 是一个特别阴险的例子,因为如果您将它用作 参数 变量,您传递给它的任何值都会被 悄悄丢弃,因为在函数或脚本的上下文中,$input 始终是任何 管道输入 .

的枚举器

这里有一个简单的例子来说明这个问题:

PS> & { param($input) "[$input]" } 'hi'
 # !! No output - the argument was quietly discarded.

$input的内建定义优先可以用下面的方式证明:

PS> 'ho' | & { param($input) "[$input]" } 'hi'
ho # !! pipeline input took precedence