【问题标题】:Powershell - difference between "-" (dash) and "." (hyphen)Powershell - “-”(破折号)和“。”之间的区别(连字符)
【发布时间】:2016-11-01 13:13:22
【问题描述】:

我是一名 C# 程序员,我一直在(根据需要)断断续续地学习 powershell。关于在 powershell 中使用点和连字符之间的区别,我有几个(希望如此)快速的问题。

以数组为例。

$arr = @("sam", "mitch", "stan") #create array
$arr.Contains("sam") #contains, apparently .NET?
$arr -contains "sam" #contains, apparently PS?

“包含”调用之间有什么区别?

是什么导致 .Contains() 可用?我知道 .NET 数组有一个 .Contains 方法……这是一样的吗?是否因为公共访问器而可用? PS 是否只是“知道”什么是 .NET 数组?

是什么导致 -contains 符号可用?

有理由使用其中一个吗?

谢谢!

【问题讨论】:

  • 哦,它只是一个运算符??我想这可以解释它!
  • 确实如此。使用 .Contains 方法,你的钱是对的。
  • 在Powershell中使用func(a,b,c)语法调用函数时要小心:marcin-chwedczuk.github.io/…
  • "PS 是否只知道 .Net 数组是什么" - PS 数组 .Net 数组。 @(1,2,3).GetType() -> Object[], basetype System.Array。但是 PowerShell 有一个 Adapted Type System (ATS) layer,它可以使用更方便的属性和方法来包装和扩展底层对象。 @(1,2,3) | get-member -view adapted 建议数组上的所有方法在 .Net 方法上都有一个 PS 自适应间接寻址,因为 .. 我不知道是什么原因(不区分大小写?)

标签: powershell


【解决方案1】:

来自 C# 世界,让我们暂时假设 Contains() 只是 Enumerable 上的扩展方法...... not far from the truth

考虑到这一点,重要的是要记住在 C# 中调用 arr.Contains( ... ) 是语法糖。 real 语法实际上是Enumerable.Contains(arr, ... )

这里正在发生类似的事情。在 PowerShell 中,您有称为 Cmdlets 的东西。 Cmdlet 构成了该语言惯用 API 的大部分。 Cmdlet 有许多可选参数来确定 Cmdlet 实际执行的操作是很常见的。 Cmdlet 参数的语法如下所示:

 CmdletName -argumentname "optional argument parameter"

现在,我知道这段代码 ($arr -contains "sam") 并不完全遵循该模式,但它是了解 powershell 正在做什么的更好方法。就 powershell 而言,对于首先学习它的人来说,最惯用的代码是使用“本机”cmdlet 参数样式语法:

$arr -contains "sam"

我在这里用吓人的引号将 native 放在了此处,因为 Powershell 最终很大程度上依赖于 .Net,并且可能它调用完全相同的 .Net Contains() 方法,与 .Net 的调用方式大致相同:查找 $arr要解析的对象引用并将其称为Contains() 函数。归根结底,$arr.Contains("sam") 甚至可能是 Powershell 执行环境生成所需函数调用的更直接路径。但是,在罗马时...我尽可能尝试使用自然的 powershell 语法,即使作为 C# 用户,另一种方式对我来说感觉更自然,但我并不总是成功。

也就是说,您对-contains 是运营商的问题的评论也非常接近。看看其他 powershell 相等运算符:-eq-ne、-lt-gt-le-ge-like 等。为了让他们感觉更熟悉,让我们开始吧回到 C#,看看 C# 是如何真正做到平等的; 不是 ==。相反,C# 最重要的相等运算符通常是obj.Equals()。突然之间,感觉和obj.Contains() 没什么不同了。

【讨论】:

  • "归根结底,$arr.Contains("sam") 甚至可能是 Powershell 执行环境生成所需函数调用的更直接路径" - 它们并不完全相同; @('A','B','C') -contains 'b' 为真,@('A','B','C').Contains('b') 为假。默认情况下,PowerShell 运算符会做一些事情来使它们不区分大小写。
  • “您对 -contains is operator 的问题的评论也非常接近” - 什么?不是很接近,这是事实
  • 它是Enumerable.Contains(arr, ... ) 而不是IEnumerable.Contains(arr, ... )。 PowerShell 中的 $arr.Contains("sam") 也会调用 IList.Contains: ((IList)arr).Contains("sam"),而不是扩展方法 Enumerable.Contains
猜你喜欢
  • 1970-01-01
  • 2016-06-06
  • 2022-11-18
  • 2011-08-28
  • 1970-01-01
  • 2020-04-10
  • 2011-03-27
  • 2019-12-03
  • 2015-02-26
相关资源
最近更新 更多