标志和方法背后的逻辑是什么?

时间:2018-01-01 09:40:06

标签: powershell

例如:

> "a,b,c" -split ","
a
b
c

> "a,b,c".split(",")
a
b
c

> "a,b,c".length
5

> "a,b,c" -length
At line:1 char:9
+ "a,b,c" -length
+         ~~~~~~~
Unexpected token '-length' in expression or statement.
    + CategoryInfo          : ParserError: (:) [], ParentContainsErrorRecordException
    + FullyQualifiedErrorId : UnexpectedToken

因此,并非每个方法都可以表示为标志/参数列表。我甚至不确定.split-split是否相同,或者这是偶然的。

我什么时候应该使用标志和方法?如何发现所有可用的标志(对于字符串,数字等

另一件事是ls -?会返回帮助文字,但"foo" -?没有。因此,虽然它接受标志,但它并不真正被视为命令

1 个答案:

答案 0 :(得分:2)

归结为此。

这......“a,b,c”-length

关于运营商 运算符是可以在命令或表达式中使用的语言元素。 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_operators?view=powershell-5.1 由于有多种运算符类型,因此上述不是单个源文档引用。

对此...“a,b,c”.length

关于方法 描述如何使用方法在PowerShell中对对象执行操作。 方法允许您检查,比较和格式化PowerShell对象的许多属性,执行操作。 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_methods?view=powershell-5.1

从你的例子:

String.Split方法 返回一个字符串数组,该数组包含此实例中由指定字符串或Unicode字符数组的元素分隔的子字符串 https://msdn.microsoft.com/en-us/library/system.string.split(v=vs.110).aspx

关于斯普利特 Split运算符将一个或多个字符串拆分为子字符串。 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_split?view=powershell-5.1

String.Length属性 Length属性返回此实例中Char对象的数量,而不是Unicode字符数。

您会注意到,如果您在PowerShell_ISE.exe或VSCode中打开它,您将立即看到,即使在运行之前,项目4也会立即显示为语法错误。这用红色波浪线表示。那个标记意味着它永远不会起作用,所以没有真正的理由去尝试它。

仅仅因为你可以输入它,并不是正确的。如果您在空格之后键入“ - ”,则会获得预期的列表。好吧,如果你在PowerShel_ISE或Visual Studio代码中。如果您在PowerShell控制台主机中,则必须按Tab键才能在列表中进行选项卡,或使用CRTL +空格键查看完整列表,然后使用选项卡或箭头查看要使用的内容。

('a,b,c').length # this is an array, and this is returning the count of the elements in the array
5
('a,b,c','d,e,f').length # note the element count difference
2

('a,b,c').Length # property use of a .Net class
5

('a,b,c') -length # attempted unknown / invalid switch (PowerShell operator) 

要知道你能做什么,不能做什么,或者怎么做,你必须得到它支持的东西。这就是Get-Member的用途。

所以Array允许这个..

('a,b,c') | Get-Member 

和... ..

('abc')   | Get-Member

Most common listed 

Name             MemberType            Definition
----             ----------            ----------
...
Split            Method                string[] Split(Params char[] separator), string[] Split(char[] separator, int count), string[] Sp...
...
Substring        Method                string Substring(int startIndex), string Substring(int startIndex, int length)                      
...
ToLower          Method                string ToLower(), string ToLower(cultureinfo culture)                                               
...
ToString         Method                string ToString(), string ToString(System.IFormatProvider provider), string IConvertible.ToString...
...
ToUpper          Method                string ToUpper(), string ToUpper(cultureinfo culture)
...
Trim             Method                string Trim(Params char[] trimChars), string Trim()
TrimEnd          Method                string TrimEnd(Params char[] trimChars)
TrimStart        Method                string TrimStart(Params char[] trimChars)
Chars            ParameterizedProperty char Chars(int index) {get;}
Length           Property              int Length {get;}

至于...... 我什么时候应该使用标志和方法? 如何发现所有可用的标志(对于字符串,数字等

您必须阅读您尝试使用的cmdlet上的帮助文件,或者至少是它的示例。

    Get-Help -Name Get-ItemProperty -Full

    Get-Help -Name Get-ItemProperty -Examples

然后介绍您尝试使用的cmdlet /函数

    (Get-Command -Name Get-ItemProperty).Parameters 
     switches (flags) which will expect a value to the right of it or not, see the property values line below

然后你可以使用cmdlet / function。

    Get-ItemProperty -Path D:\Temp | Format-Table -AutoSize -Wrap
    Get-ItemProperty -Path D:\Temp | Format-List
    Get-ItemProperty -Path D:\Temp | Format-List -Force
    Get-ItemProperty -Path D:\Temp | Select-Object -Property * # property values
    (Get-ItemProperty -Path D:\Temp) | Get-Member

至于...... 另一件事是ls - ?返回帮助文本,但“foo” - ?没有。 因此,虽然它接受标志,但它并不真正被视为命令

除非您创建了foo函数或模块,否则Foo不是PowerShell中任何内容的有效名称。所以,它应该热回报任何东西。 再一次,仅仅因为你可以输入它,并不能使它正确。

在大多数情况下,如果您正在执行上述操作并且您没有获得自动智能感知,那么您所做的可能是错误的。

查看系统上的所有cmdlet,函数等以供使用。你这样做。

Get-Command