【问题标题】:Using Start-Job and ArgumentList How do you pass an array and string Values使用 Start-Job 和 ArgumentList 如何传递数组和字符串值
【发布时间】:2017-11-19 12:52:35
【问题描述】:

使用 Start-Job 和 ArgumentList,如何将一个数组和另一个变量传递给接收脚本?

如果我只需要传递一个数组,这很有效

Start-Job -FilePath "c:\thescript.ps1" -ArgumentList (,$newArray)

试过了,但接收脚本中没有使用第二个值。

Start-Job -FilePath "c:\thescript.ps1" -ArgumentList (,$newArray,"x") 

thescript.ps1 示例:

param (
    [string[]]$aMyArray,
    [string]$sMyString
)

function DoWork ([string]$aItem,[string]$sMyString)
{
    #worker
}

foreach($aItem in $aMyArray)
{
    DoWork $aItem $sMyString
}

我目前正在使用 PowerShell 2.0

【问题讨论】:

  • 从括号中取出 x。您不使用逗号来分隔参数。否则,它们会被视为单个对象。
  • @Matt 这就是你的建议? -ArgumentList (,$newArray) "x"
  • 是的。这完全取决于您的用例以及 script.ps1 的配置方式。
  • @Briantist。他知道如何传递数组。这是他遇到问题的下一个论点。我一直在寻找一个多参数的骗子,但没有找到我喜欢的。
  • @Matt 我知道你是对的;重新打开。

标签: arrays powershell parameter-passing powershell-2.0


【解决方案1】:

刚用谷歌搜索了同样的问题,但最后我想通了。这是相当直截了当的。尽管在所有帖子中,将数组传递给作业的解决方案是 (,$ArrayArg) 并且如果这是唯一的论点,它就可以工作(对我来说这仍然很奇怪)。 虽然有多个参数,一个是数组,但这对我有用:

$foo1 = @("1","2","3")
$foo2 = "foo"

Start-Job -Name Test `
-ScriptBlock {
    param([string[]]$arg1,[string]$arg2)
    Write-Output $arg1
    Write-Output $arg1.GetType()
    Write-Output "----"
    Write-Output $arg2
    Write-Output $arg2.GetType()
} `
-ArgumentList @($foo1),$foo2

【讨论】:

  • 是的,这很简单,但是提供的示例不起作用。在我的例子中,$aMyArray 是一堆 URL。最终选择了不同的路线。
  • 这对我不起作用。我不得不使用$using:foo1之类的东西。
  • 如果你拿走 $arg2 就会改变。
  • 事实上,@( ) 并没有做任何事情。 ,$foo2 是它起作用的原因。
【解决方案2】:

我必须用 $list 周围的逗号和括号来这样做:

$list = echo a b c 

Start-Job -ScriptBlock {
  param ( $a )

  $a | % { $_ }
} -Args (,$list) | Wait-Job | Receive-Job

或使用using 范围:

$list = echo a b c

Start-Job -ScriptBlock {
  $using:list | % { $_ }
} | Wait-Job | Receive-Job

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-12
    • 1970-01-01
    • 2018-11-02
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-03
    相关资源
    最近更新 更多