如何将变量(字符串数组)传递给其他PowerShell脚本

时间:2014-05-09 22:30:19

标签: arrays powershell

我在包含字符串数组的PowerShell脚本中有一个变量$ Tasks,我需要将变量传递给其他PowerShell脚本并对其进行处理,比如遍历数组并对每个脚本执行操作item(字符串)。

然而,在我的变量从数组转换为字符串的某些方面(通常在它遇到script2.ps1时),我无法遍历它。在整个过程中,我需要做什么才能将变量保持为数组?

以下是变量的工作流程:

Script1.ps1

$Tasks = @(
"Task1 - Name1",
"Task2 - Name2",
"Task3 - Name3"
)

powershell "& {. $pwd\Script2.ps1 -BuildNum $BuildNum; Run-Validation -Tasks $Tasks}"

Script2.ps1

param(
    $Tasks=$()
)

Function Run-Validation
{
    param($Tasks)

    If ($Tasks)
    {
        Test-Tasks $Tasks
    }
}

Script3.ps1

Function Test-Tasks ($Tasks)
{
    ForEach ($Task in $Tasks)
    {
        do_stuff
    }
}

3 个答案:

答案 0 :(得分:2)

发生这种情况的原因是您在双引号字符串中扩展数组$Tasks。在将命令行传递给PowerShell.exe之前,它将扩展为:

Arg 0 is <& {. C:\Script2.ps1 -BuildNum ; Run-Validation -Tasks Task1 - Name1 Task2 - Name2 Task3 - Name3}>

因此Run-Validation -Tasks参数只能看到“Task1”。如果您要查看Run-Validation函数内部的$ args,您将看到其余的参数。

BTW,为什么要调用另一个Powershell.exe会话?为什么不这样调用:

. $PSScriptRoot\Script2.ps1 -BuildNum $BuildNum
Run-Validation -Tasks $Tasks

请注意,上面只有如果你消除了Script2.ps1中的脚本级$ Tasks参数。如果没有,当你点源Script2.ps1来访问Run-Validation函数时,Script2.ps1中的$ Tasks会有效地覆盖Script1.ps1中设置的值。

如果您真的想在单独的PowerShell会话中调用它,可以执行以下操作:

$OFS="','"
powershell "& {. $pwd\Script2.ps1 -BuildNum $BuildNum; Run-Validation -Tasks '$Tasks'}"

答案 1 :(得分:0)

我发现将PowerShell脚本构建为函数很有帮助。我建议您在准备使用$ Tasks时拉入$ Tasks,而不是将$ Tasks一直传递给多个脚本。

这相当于 Script1.ps1

<强> taskList.ps1

Function Get-Tasks()
{
    $Tasks = @(
        "Task1 - Name1",
        "Task2 - Name2",
        "Task3 - Name3"
    )
    return $Tasks
}

这相当于 Script2.ps1 Script3.ps1 的组合:

# Dot source the scripts we will need
.$PSScriptRoot\taskList.ps1

# Get the list of tasks
$taskList = Get-Tasks

if ($taskList -ne $null)
{
    foreach ($task in $taskList)
    {
        # Do stuff here
        "Processing task: " + $task
    }
}

注意: $ PSScriptRoot 将从当前工作目录加载。如果此文件位于其他位置,请使用完整路径。

但是,如果您仍想保留当前结构,只需将 Script.1 更新为以下内容

# Dot source the scripts we will need
.$PSScriptRoot\Script3.ps1

$Tasks = @(
    "Task1 - Name1",
    "Task2 - Name2",
    "Task3 - Name3"
)

Run-Validation -Tasks $Tasks

答案 2 :(得分:0)

我在脚本中使用了这样的参数定义:

[cmdletbinding()]
Param(
    [Parameter(Position=0, ValueFromPipeline, ValueFromPipelineByPropertyName)]
    [ValidateNotNullorEmpty()]
    [Alias("cn", "name")]
    [String[]]$var
)

在此示例中,您可以将[String]$var定义为单个字符串变量,或将[String[]]$var定义为字符串变量数组。