[英]PowerShell: `New-Object` `-ArgumentList` vs calling constructor vs type casting
我刚刚开始学习 PowerShell 的一些基础知识,无法理解New-Object
和类型转换。 例如这个:
# all of these yield the same
New-Object System.Net.Sockets.TcpListener -ArgumentList 5000
New-Object System.Net.Sockets.TcpListener(5000)
[System.Net.Sockets.TcpListener]500 # this works
# all of these yield the same
New-Object -TypeName System.Net.Sockets.TCPClient -ArgumentList "8.8.8.8", 53
New-Object System.Net.Sockets.TCPClient("8.8.8.8", 53)
[System.Net.Sockets.TCPClient]::New("8.8.8.8", 53)
# but this doesn't work
# [System.Net.Sockets.TCPClient]("8.8.8.8", 53) # does not work
-ArgumentList
和使用(arg1,...)
什么区别? 是不是类型的名称和(arg1,...)
被解释为New-Object
两个不同参数,即使它们之间没有空格,因此(arg1,...)
被分配为-ArgumentList
值?System.Net.Sockets.TCPClient
的第二个示例进行转换不起作用? 我看到的唯一区别是它需要多个参数,而System.Net.Sockets.TcpListener
需要一个参数。 但是为什么 PowerShell 可以通过调用其构造函数将整数转换为System.Net.Sockets.TcpListener
而不能将数组转换为System.Net.Sockets.TCPClient
呢? 即为什么这两个不等价:
[System.Net.Sockets.TCPClient]::New("8.8.8.8", 53) # works
[System.Net.Sockets.TCPClient]("8.8.8.8", 53) # does not work
使用
-ArgumentList
和使用(arg1, ...)
什么区别?
不要使用(arg1,...)
它是仅碰巧有效的伪方法语法 - 请参阅此答案的底部部分。
相反,使用arg1, ...
- 没有括号,列表前有空格; 这是位置隐含的等价物-ArgumentList arg1, ...
(或-Args arg1, ...
)
为什么对
System.Net.Sockets.TCPClient
的第二个示例进行转换不起作用?
铸造仅适用于两种变体:
使用与单参数构造函数匹配的标量,或者在string的情况下,如果目标类型具有静态.Parse()
方法。
使用哈希表( @{ ... }
),其条目的键匹配目标类型的属性,并假设目标类型具有无参数公共构造函数。
因此,您不能从值数组中进行转换。
有关更多信息,请参阅此答案。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.