2015-07-13 42 views
0

最近我遇到了提供一个数组数组作为PS脚本输入参数的问题。PSCustomObjects数组作为输入参数

我有两个脚本。一种是启动和管理进程,另一种是在作为输入参数提供的计算机上执行某些操作。

它成功地工作时,我提出一个PC上-Computer参数

[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 

等。

参数1和参数只能包含0或1

如何传递这样的阵列到脚本?

+1

嗯,什么命令你尝试运行?如果您尝试启动另一个Powershell脚本,则应该使用'&'运算符来运行脚本。否则,尝试通过命令行传递数组将会使它变成纯字符串,因为命令行处理不知道Powershell类型,数组等。 – Vesper

+0

我试图运行另一个PowerShell脚本。生成的命令就像'powershell.exe -WindowStyle Normal -Command“E:\ secondscript.ps1 - 计算机<这里应该是一个数组>>”' – kade

+0

另一件事是我更喜欢使用System.Diagnostics.Process类的原因稍后在我管理的脚本中启动了几个并行的进程。 然后,解决方案可以将该数组作为字符串像'@ {...}'一样传递,然后再转换回secondscript.ps1中的数组。 这是否有意义? – kade

回答

0

最后我找到了适合我的解决方案。 我转换$套餐是PSCustomObjects的阵列到像字符串:

@([pscustomobject] @ {主机名= “”;参数1 =;参数2 =},...)