【问题标题】:Array of PSCustomObjects as input parameterPSCustomObjects 数组作为输入参数
【发布时间】: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


【解决方案1】:

最后我找到了适合我的解决方案。 我将 PSCustomObjects 数组 $Package 转换为字符串,例如:

@([pscustomobject]@{Hostname="";Param1=;Param2=},...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 2018-04-04
    相关资源
    最近更新 更多