我对 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/