powershell - 如何将一个脚本中的未绑定(bind)参数作为参数传递给另一个脚本?

标签 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 或任何参数),而不必担心更新所有客户端代码以匹配.

这可能吗?

最佳答案

你错过了两个关键的事情:

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

当您组合这些时,您可以轻松地将所有参数传递到另一个脚本,如下所示:

# foo.ps1

. common.ps1 @args

使用这样的源文件:

#common.ps1

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

你得到这些输出:

> foo.ps1 返回 $foo 是 foo

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


请注意,如果您尝试使用 PowerShell ISE,可能需要一段时间才能弄清楚这一点或调试其中的任何一个。当您在调试器中时, $args 和 $MyInitation.UnboundArguments 都会尽力向您隐藏该信息。它们看起来完全是空的。

您可以使用 >> echo "$(@args)" 打印参数,但这也提供了告诉调试器继续的非常奇怪的副作用。我认为泼溅是添加一个额外的换行符,并且最终出现在命令窗口中。

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

关于powershell - 如何将一个脚本中的未绑定(bind)参数作为参数传递给另一个脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58124707/

相关文章:

parsing - 如何从 PowerShell 中的字符串中删除所有换行符?

arrays - 如何将数组中的每个元素与 Powershell 中多个其他数组中的每个元素组合

csv - 在 Powershell 中快速拆分以逗号分隔的 CSV 行,并在字符串周围加上引号

powershell - RedirectStandardError $logFile 并 append ?

java - 从 Java 调用 PowerShell 时偶尔出现 Windows 权限错误 - "running scripts disabled"

powershell - Azure Runbook 自动化调用嵌套 Runbook。错误 嵌套工作流不支持高级参数验证

powershell - 我可以使用基于注释的文档为示例添加标题吗?

powershell - 剪贴板中的文本不是数组

powershell - 为什么 Powershell 将任何字符串与 $null 匹配

PowerShell:使用相对路径从快捷方式运行脚本