【发布时间】:2015-10-01 11:25:56
【问题描述】:
最近我遇到了提供数组数组作为 PS 脚本的输入参数的问题。
我有两个脚本。一是启动和管理进程,二是在作为输入参数提供的计算机上执行某些操作。
当我通过-Computer参数提交一台PC时,它成功运行
[Parameter(Mandatory=$False,
ParameterSetName="input1",
HelpMessage="Privide single computer name")]
[alias("host","workstation")]
[string]$Computer=$env:COMPUTERNAME,
或超过-InputFile参数
[Parameter(Mandatory=$True,
ParameterSetName="input3",
HelpMessage="Privide full path to input file which contains list of hosts")]
[ValidatePattern("^.*\.(TXT|txt|CSV|csv)")]
[alias("file","input")]
[string]$InputFile,
但是,当我想提交一个数组时,我还有另一个输入参数。参数名称为-Computers:
[Parameter(Mandatory=$True,
ParameterSetName="input2",
HelpMessage="Privide array of computers")]
[alias("hosts","workstations")]
[string[]]$Computers,
在我启动进程并管理它们的第一个脚本中,我使用以下内容:
#Define arguments for executable
$PSArguments = $null
$PSArguments += "-WindowStyle Normal "
$PSArguments += "-Command `"$Script_DPNE "
$PSArguments += "-Computers $Package`""
#Prepare process
$Process = New-Object System.Diagnostics.Process
$Process.StartInfo.UseShellExecute = $False
$Process.StartInfo.WindowStyle = "Hidden"
$Process.StartInfo.CreateNoWindow = $True
$Process.StartInfo.FileName = $Executable
$Process.StartInfo.Arguments = $PSArguments
#Start process
$Process.Start() | Out-Null
不幸的是,$package 是一个数组,没有通过。
$Package 具有以下结构:
Hostname param1 param2
-------- ------ ------
host1 1 1
host2 0 1
host3 1 1
host4 1 0
等等。
param1 和 param2 只能包含 0 或 1
如何将这样的数组传递到脚本中?
【问题讨论】:
-
嗯,你尝试运行什么命令?如果您尝试启动另一个 Powershell 脚本,则应改为使用
&运算符来运行脚本。否则,通过命令行传递数组的尝试会将其转换为纯字符串,因为命令行处理不知道 Powershell 类型、数组等。 -
我正在尝试运行另一个 powershell 脚本。结果命令就像
powershell.exe -WindowStyle Normal -Command "E:\secondscript.ps1 -Computers <here should be an array>" -
另一件事是我更喜欢使用 System.Diagnostics.Process 类,因为稍后在脚本中我管理了多个并行的启动进程。然后解决方案可能是将这个数组作为字符串传递给
@{...},然后在 secondscript.ps1 中转换回数组。这有意义吗? -
因此,您需要并行执行一些操作 - 好的,将
-AsJob添加到参数列表中。如果您坚持创建新进程,则必须将数组序列化为命令行,这并不像听起来那么容易。你说的是明智的,但我还不知道是否可行。 -
$package 真的是数组吗?或者它是一个哈希表数组?
标签: arrays powershell parameter-passing