PowerShell 中的函数重载
可以在 PowerShell 中重载函数吗?
我希望我的函数接受字符串、数组或某些开关。
我想要的一个例子:
- Backup-UsersData singleUser
- Backup-UsersData @('Alice', 'Bob', 'Joe')
- 备份用户数据 -all
Can you overload functions in PowerShell?
I want to my function to accept a string, array or some switch.
An example of what I want:
- Backup-UsersData singleUser
- Backup-UsersData @('Alice', 'Bob',
'Joe') - Backup-UsersData -all
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
在 PowerShell 中函数不会重载。最后一个定义会覆盖同一作用域中的前一个定义,或隐藏父作用域中的前一个定义。因此,您应该创建一个函数并提供一种通过参数区分其调用模式的方法。
在 V2 中,您可以使用高级函数,请参阅
help about_Functions_Advanced_Parameters
并避免在解决参数集歧义时进行一些手动编码:请注意,这种机制有时很奇怪。例如,在第一个测试中,我们必须显式指定参数名称
-user
。否则:在许多情况下,具有混合参数的标准函数(而不是高级函数)就可以:
但在这种情况下,您应该解决(或接受并忽略)歧义,例如,决定在以下情况下做什么:
In PowerShell functions are not overloaded. The last definition overrides the previous in the same scope or hides the previous in a parent scope. Thus, you should create a single function and provide a way to distinguish its call mode by arguments.
In V2 you may use an advanced function, see
help about_Functions_Advanced_Parameters
and avoid some manual coding on resolving parameter set ambiguities:Note that this mechanism is sometimes strange. For example in the first test we have to specify parameter name
-user
explicitly. Otherwise:In many cases standard, not advanced, function with mixed parameters will do:
But in this case you should resolve (or accept and ignore) ambiguities, e.g. to decide what to do if, say:
这是罗马答案的一个变体,我认为它更灵活一些:
Here is a variant of Roman's answer that I think is a little more flexible:
1) 构建一个类...
1+) 如果您喜欢在不实例化的情况下调用它们,请使用静态方法...
2) 调用类或对象中的方法...重载工作正常
-OR-< /em>
3)
如果(像我一样)
您希望将“重载函数”放入库中...
这样您的用户就可以透明地使用它们...
从代码或交互式命令行(REPL)...
我能想到的最接近
“Powershell 中的重载函数”
是这样的:
也许在 PS-Core v8 中??? ;-)
希望有帮助...
1) Build a class...
1+) Use STATIC METHODS if you prefer to call them without instantiation...
2) Call the methods in class or object... overload works OK
-OR-
3)
If (like me)
you want to have "Overloaded Functions" placed in a libraries...
so your users can use them transparently...
from code or from Interactive Command Line (REPL)...
the closest I could came to
"Overloading functions in Powershell"
was something like this:
Maybe in PS-Core v8??? ;-)
Hope it helps...
如果您使用 PSObject 而不是 Object 来定义参数类型,它应该可以工作。
例如,函数 Get-Control 知道如何基于字符串或模板类型进行重载,并且可以使用位置值进行调用:
要使重载起作用,请使用 PSObject,如下所示:
If you use PSObject instead of Object to define your parameter type, it should work.
For example, The function Get-Control, know's how to overload based on type string or template and can be called using the positional value:
To make the overload work, use PSObject as follows:
已经发布了一些很好的答案,但我想我会分享另一种方法;虽然从技术上讲,此方法不是函数重载,但它确实提供了类似的功能,这可能就足够了,具体取决于您的要求。
这个想法是使用一个只有 1 个 [HashTable] 类型参数的函数。您需要传递给函数的所有参数都将通过这个单个哈希表参数传递。下面的代码应该很容易看出它是如何工作的。
There are some good answers already posted but I thought I would share another way of doing this; while technically this method is not Function Overloading, it does provide a similar functionality which might be sufficient, depending on your requirements.
The idea is to use a function with only 1 parameter of type [HashTable]. All the parameters that you need to pass to your function will be passed through this single hash table parameter. The code below should be easy enough to see how it works.