首页 > 解决方案 > 如何将参数传递给通过 Start-Job 调用的 PS 脚本?

问题描述

我想使用 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

像这样运行,它返回“到输出”,所以 $input 在作业运行的脚本中为空。

我见过与此类似的其他问题,但他们大多使用 -Scriptblock 代替 -FilePath。通过 Start-Job 将参数传递给文件是否有不同的方法?

标签: powershellparameter-passingautomatic-variable

解决方案


tl;博士

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

  • 简单地重命名$input,比如说,$InputObject解决你的问题。


正如Lee_Dailey 所指出的,$input它是一个自动变量不应分配给它(它由 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

推荐阅读