我对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
或任何参数),而不必担心更新所有代码匹配的客户端代码。
这可能吗?
答案 0 :(得分:1)
您错过了两个关键事项:
args
-捕获脚本的所有(唯一)未绑定参数@
)-用于将数组或哈希表传递给命令,而不是像使用那样使它们变平$
结合使用这些参数时,您可以轻松地将所有参数传递给另一个脚本,如下所示:
# 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
。