【问题标题】:PowerShell Script Arguments Passed as ArrayPowerShell 脚本参数作为数组传递
【发布时间】:2013-10-24 18:33:12
【问题描述】:

编辑:我已将此处的代码更改为一个简单的测试用例,而不是出现此问题的完整实现。

我正在尝试从另一个调用一个 Powershell 脚本,但事情并没有像我预期的那样进行。据我了解,“&”运算符应该将数组扩展为不同的参数。这不会发生在我身上。

caller.ps1

$scriptfile = ".\callee.ps1"
$scriptargs = @(
    "a",
    "b",
    "c"
)

& $scriptfile $scriptargs

callee.ps1

Param (
    [string]$one,
    [string]$two,
    [string]$three
)

"Parameter one:   $one"
"Parameter two:   $two"
"Parameter three: $three"

运行 .\caller.ps1 会产生以下输出:

Parameter one:   a b c
Parameter two:
Parameter three:

我认为我遇到的问题是$scriptargs 数组没有扩展,而是作为参数传递。我正在使用 PowerShell 2。

如何让 caller.ps1 使用一组参数运行 callee.ps1?

【问题讨论】:

  • 我还应该在这里注意,我使用了 PowerShell 社区扩展中的 EchoArgs 实用程序,并且参数的格式似乎正确。
  • 您将部署参数定义为一个数组,您是否尝试将字符串作为表达式调用
  • 我正在尝试将参数构建为数组,如 this blog post 标题下的“但是如果我想构建参数以在我的脚本中传递呢?”
  • 看起来您的问题实际上与 MSDeploy 几乎没有关系,更多的是与动态调用存储在字符串中的 PowerShell 命令有关。我建议编辑你的标签,甚至可能修剪你的代码,使其更短,更切中要害。
  • 您可能会在此处查看可用于配置参数的其他选项,但请注意您使用的 PowerShell 版本:technet.microsoft.com/en-us/library/hh847743.aspx

标签: powershell


【解决方案1】:

调用本机命令时,& $program $programargs 之类的调用将正确转义参数数组,以便可执行文件正确解析它。但是,对于 PowerShell cmdlet、脚本或函数,没有需要序列化/解析往返的外部编程,因此数组按原样作为单个值传递。

相反,您可以使用splatting 将数组(或哈希表)的元素传递给脚本:

& $scriptfile @scriptargs

& $scriptfile @scriptargs 中的@ 导致$scriptargs 中的值应用于脚本的参数。

【讨论】:

【解决方案2】:

您将变量作为单个对象传递,您不需要单独传递它们。

这里可行:

$scriptfile = ".\callee.ps1"
& $scriptfile a b c

也是这样:

$scriptfile = ".\callee.ps1"
$scriptargs = @(
    "a",
    "b",
    "c"
)

& $scriptfile $scriptargs[0] $scriptargs[1] $scriptargs[2]

如果你需要将它作为单个对象传递,比如数组,那么你可以让被调用者脚本分割它;具体代码取决于您传递的数据类型。

【讨论】:

    【解决方案3】:

    使用 Invoke-Expression cmdlet:

    Invoke-Expression ".\callee.ps1 $scriptargs"
    

    结果你会得到:

    PS > Invoke-Expression ".\callee.ps1 $scriptargs"
    Parameter one:   a
    Parameter two:   b
    Parameter three: c
    PS >
    

    【讨论】:

    • 这行得通,另外一个好处是您在设计时不需要知道参数是什么(或有多少个)。
    • Invoke-Expression 有许多带有引用参数的痛苦错误,也可能是一个安全漏洞(如果您不仔细检查输入)。
    • 比起这个,我肯定更喜欢 Emperor XLIIs 解决方案。
    猜你喜欢
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 2012-10-17
    • 1970-01-01
    相关资源
    最近更新 更多