如何将参数传递给通过 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
我想使用 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