powershell - 如何将参数传递给通过 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 将参数传递给文件是否有不同的方法?
解决方案
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
推荐阅读
- sql - 有条件地在同一行中的父详细信息
- android - 如何使用 kotlin 获取文件夹的路径?
- python - 将行从excel表复制到新表中而不复制双打
- azure - 当持久性卷声明超过存储时会发生什么?
- flutter - 如何使卡片像颤动的标签一样可滑动?
- extjs - 基于 extjs 网格中的另一个组合框填充字段
- swift - 快速获取日期范围内的日期名称和日期重复次数
- android - 将基于 Web 的数据库管理应用程序转换为移动应用程序以使其离线工作
- arduino - 如何从 Arduino“9 Axis Motion Shield”获取数据和校准
- laravel - 如何在 laravel 中使用相同的表单进行添加和编辑