2017-05-31 77 views
3

我正在使用Get-NetIPAddress。我只想要的是沒有任何格式或表格或任何東西的實際地址。圍繞PowerShell命令的括號如何與沒有?

如果我使用

(Get-NetIPAddress).IPAddres 

我得到的所有端口地址的列表。我想只有一個端口,所以我想管,但給了什麼回報:

(Get-NetIPAddress).IPv4Address | Where-Object InterfaceAlias -eq "MyPortName" 

但是,如果我這樣做:

Get-NetIPAddress.IPv4Address | Where-Object InterfaceAlias -eq "MyPortName" 

它說,這是一個無效的命令。

如果我用這個:

Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName" | Where-Object AddressFamily -eq IPv4 | Select-Object IPAddress 

我得到:

IPAddress 
--------- 
10.45.22.100 

那麼到底是怎麼回事,當我把括號圍繞GET-NetIPAddress,我怎麼能得到公正的混賬地址號碼一個特定的端口?

回答

1

括號的工作方式與他們在數學中一樣,它們設置優先順序,所以括號內的任何內容都將首先執行。

得到的只是從你的最後一個命令的IP地址值,而是執行此操作:

(Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName" | Where-Object AddressFamily -eq IPv4).IPAddress 

此命令:

(Get-NetIPAddress).IPv4Address 

返回IPv4Address財產(可能作爲字符串)的值,這就是爲什麼這個命令然後不起作用:

(Get-NetIPAddress).IPv4Address | Where-Object InterfaceAlias -eq "MyPortName" 

因爲你是pipi將包含IP地址的字符串對象插入到Where-Object cmdlet中,然後查找過濾該對象中不存在的InterfaceAlias屬性。

當您通過.表示法訪問房產時,您會收到它的價值。當您通過Select-Object cmdlet訪問某個媒體資源時,您將返回一個對象(與源對象類型相同),並將其過濾爲僅包含該媒體資源(除非您使用-ExpandProperty開關,這會導致Select-Object返回值定義屬性而不是與使用.表示法相同的對象)。長話短說,做任何你需要先做的過濾,然後最後訪問你想要的屬性/屬性。

3

通過附上一個命令(),您可以創建一個優先順序,因此()中的所有內容都將首先執行,然後您將對其他命令進行評估。

還,有沒有這樣的構建物cmdlet.property

爲第二部分,你做(Get-NetIPAddress).IPv4Address你可能得到另一個對象後,剛剛從比較輸出:

Get-NetIPAddress | Get-Member 

(Get-NetIPAddress).IPv4Address | Get-Member 
0

使用你提供的語法如下:

Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName" | Where-Object AddressFamily -eq IPv4 | Select-Object -Expand IPAddress 

通知「ExpandProperty:

Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName" | Where-Object AddressFamily -eq IPv4 | Select-Object IPAddress 

...想起來的IP地址(不帶對象符號),可以通過兩種方式完成「的論點,在上述行上縮寫爲」展開「...或:

(Get-NetIPAddress | Where-Object InterfaceAlias -eq "MyPortName" | Where-Object AddressFamily -eq IPv4 | Select-Object IPAddress).IPAddress 

...我們返回ob ject,然後引用該對象上的IPAddress屬性。

2

Get-NetIpAddress是一個cmdlet,PowerShell運行它。它輸出一個或多個對象,我的意思是一個許多名稱和數字和功能,所有組合成一個blob

Get-NetIpAddress | Select-Object IPv4Address將對象轉換爲更簡單,更小的對象,只有一個屬性IPv4Address。

那這就是:

IPAddress 
--------- 
10.45.22.100 

它是對象的渲染與一個屬性

Get-NetIpAddress | Select-Object -ExpandProperty IPv4Address取對象,只取IPv4Address,並拋出分組,僅留下IPv4Address作爲字符串。

這將輸出:

10.45.22.100 
10.45.22.101 

這些已經擴展到字符串,沒有列標題。他們已經被打開了。

這是你想做很多事情,但它是很多打字。 $x = Get-NetIpAddress; $x.IPv4Address是從對象中取出僅包含Ipv4Address並且沒有任何其他東西的快捷方式。

所以,你想要做

Get-NetIpAddress.IPv4Address但翻倒,因爲它看起來像一個不同的cmdlet的名稱和PowerShell試圖來看,它和不能。這只是語法的衝突 - 它可能是一個名稱,它可能是一個屬性查找,而powershell選擇的方式不同。你需要一些東西(parens)來作出區分。

(Get-NetIpAddress).IPv4Address使shell清楚地知道有一個cmdlet,它運行該命令,然後將結果放入括號中,然後從它們中獲取屬性。這清除了名稱衝突。但此時您已經拋棄了InterfaceName,因此將此輸出推送到管道中不能讓您根據接口名稱進行選擇。

按照通過,你可以看到

  • 如果你(Get-NetIPAddress).IPv4Address輸出字符串和你扔掉所有出來的cmdlet的其他數據。
  • 如果你想基於接口的名稱來選擇一個字符串,你必須這樣做之前你解開的IP扔接口名稱了。

所以

Get-NetIpAddress | 
    Where-Object { pick the one I want } | 
    Select-Object -ExpandProperty 'the thing I want'