我在包含字符串数组的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
}
}
答案 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
定义为字符串变量数组。