如何将未绑定的参数从一个脚本作为参数传递给另一个脚本?

时间:2019-09-26 20:59:14

标签: powershell

我对PowerShell几乎没有经验。

我正在尝试将一些非常常用的代码重构为一个脚本,该脚本可以在需要的地方获取,而不是将相同的代码复制并粘贴到 n 不同的脚本。

我想要得到的场景看起来(我认为)是这样的:

#common.ps1:
param(
    # Sure'd be great if clients didn't need to know about these
    $some_params_here
    ...
)

function Common-Func-Uses-Params {
   ...
}

⋮
# foo/bar/bat.ps1:

# sure would love not to have to redefine all the common params() here...

. common.ps1 <pass-the-arguments>

Common-Func-Uses-Params $specific_Foo/Bar/Bat_Data

如上面的伪注释所示,到目前为止,我还只能通过捕获调用脚本中的参数来做到这一点。

我希望能够更新公共代码(例如使用-Debug-DryRun-Url或任何参数),而不必担心更新所有代码匹配的客户端代码。

这可能吗?

1 个答案:

答案 0 :(得分:1)

您错过了两个关键事项:

  • args -捕获脚本的所有(唯一)未绑定参数
  • splatting @ )-用于将数组或哈希表传递给命令,而不是像使用那样使它们变平$

结合使用这些参数时,您可以轻松地将所有参数传递给另一个脚本,如下所示:

# foo.ps1

. common.ps1 @args

具有这样的源文件:

#common.ps1

param ([string]$foo = "foo")
echo "`$foo is $foo"

您将获得以下输出:

> foo.ps1返回$foo is foo

> foo.ps1 -Foo bar返回$foo is bar


请注意,如果您尝试使用PowerShell ISE,可能要花一些时间才能解决或调试其中的任何一个。当您在调试器中时,$ args或$ MyInvocation.UnboundArguments都将尽力向您隐藏该信息。它们似乎完全是空的。

您可以使用>> echo "$(@args)"打印args,但这也提供了告诉调试器继续运行的怪异副作用。我认为该操作会增加额外的换行符,并且最终会在命令窗口中出现。

为此,我最好的解决方法是在脚本顶部添加$theargs = $args,并记住在调试器中使用$theargs