【问题标题】:How to pass parameters to a PS script invoked through Start-Job?如何将参数传递给通过 Start-Job 调用的 PS 脚本?
【发布时间】:2021-02-25 21:15:43
【问题描述】:

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

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

【问题讨论】:

  • $Input 是保留的自动变量。请勿将其用作只读项目以外的任何内容。 [咧嘴]

标签: powershell parameter-passing automatic-variable


【解决方案1】:

tl;dr

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

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


正如Lee_Dailey 所说,$inputautomatic variable不应分配给(它由 PowerShell 自动管理以提供非高级脚本和函数中的管道输入)。

很遗憾,出乎意料地,几个自动变量,包括$input可以分配给:参见this answer

$input 是一个特别阴险的例子,因为如果你将它用作 parameter 变量,你传递给它的任何值都会悄悄地丢弃,因为在上下文中函数或脚本的$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

【讨论】:

    猜你喜欢
    • 2013-01-17
    • 2017-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2023-01-02
    • 1970-01-01
    • 2015-10-20
    • 2019-10-20
    相关资源
    最近更新 更多