Welcome

首页 / 编程脚本 / Windows Powershell 命令返回数组

当我们把一个命令的执行结果保存到一个变量中,可能会认为变量存放的是纯文本。
但是,事实上Powershell会把文本按每一行作为元素存为数组。如果一个命令的返回值不止一个结果时,Powershell也会自动把结果存储为数组。
PS C:Powershell> $IPcfg=ipconfigPS C:Powershell> $IPcfgWindows IP ConfigurationEthernet adapter Local Area Connection:Connection-specific DNS Suffix . : ***Link-local IPv6 Address . . . . . : ***IPv4 Address. . . . . . . . . . . : 192.168.140.128Subnet Mask . . . . . . . . . . . : 255.255.252.0Default Gateway . . . . . . . . . : 192.168.140.1Tunnel adapter isatap.mossfly.com:Connection-specific DNS Suffix . : ***Link-local IPv6 Address . . . . . : ***Default Gateway . . . . . . . . . :***Tunnel adapter Teredo Tunneling Pseudo-Interface:Media State . . . . . . . . . . . : Media disconnectedConnection-specific DNS Suffix . :PS C:Powershell> $IPcfg.Count22
使用数组存储结果
判断一个变量是否为数组
PS C:Powershell> $ip=ipconfigPS C:Powershell> $ip -is [array]TruePS C:Powershell> "abac" -is [array]FalsePS C:Powershell> $str="字符串"PS C:Powershell> $str.ToCharArray() -is [array]True
查看数组的元素个数用$array.Count属性。访问第x个元素,使用$array[x-1],因为数组是以0开始索引的。
使用管道对数组进一步处理

PS C:Powershell> ipconfig | Select-String "IP"Windows IP ConfigurationLink-local IPv6 Address . . . . . : ***IPv4 Address. . . . . . . . . . . : ***Link-local IPv6 Address . . . . . : ***
使用真实的对象操作

为什么不愿把IPconfig返回的结果称为对象,因为它不是真正Cmdlet命令,真正的Powershell命令返回的数组元素可不止一个字符串,它是一个内容丰富的对象。
PS C:Powershell> lsDirectory: C:PowershellModeLastWriteTime Length Name----------------- ------ ----d----2011/11/23 17:25ABCd----2011/11/29 18:21myscript-a---2011/11/24 18:30 67580 a.html-a---2011/11/24 20:04 26384 a.txt-a---2011/11/24 20:26 12060 alias-a---2011/11/24 20:27 12060 alias.ps1-a---2011/11/23 17:25 0 b.txt-a---2011/11/23 17:25 0 c.txt-a---2011/11/23 17:25 0 d.txt-a---2011/11/25 11:20556 employee.xml-a---2011/11/29 19:23 21466 function.ps1-a---2011/11/28 11:12186 LogoTestConfig.xml-a---2011/11/24 17:377420 name.html-a---2011/11/28 15:30 63 ping.bat-a---2011/11/24 17:44 735892 Powershell_Cmdlets.html-a---2011/11/30 16:042556 psdrive.html-a--- 2011/12/2 18:47140 test.ps1-a---2011/11/23 17:37242 test.txt-a---2011/11/28 16:42170 test.vbsPS C:Powershell> $result=lsPS C:Powershell> $result.Count20

数组的每一个元素存放的是一个System.IO.DirectoryInfo对象。
当我们输出这些对象时,Powershell会自动帮我们把它转换成友好的文本格式。
PS C:Powershell> $result[0].gettype().fullnameSystem.IO.DirectoryInfoPS C:Powershell> $result[0]Directory: C:PowershellModeLastWriteTime Length Name----------------- ------ ----d----2011/11/23 17:25ABC对于任何一个对象都可以使用Format-List * 查看它所有的属性和方法。PS C:Powershell> $result[0] | fl *PSPath: Microsoft.PowerShell.CoreFileSystem::C:PowershellABCPSParentPath : Microsoft.PowerShell.CoreFileSystem::C:PowershellPSChildName: ABCPSDrive: CPSProvider: Microsoft.PowerShell.CoreFileSystemPSIsContainer : TrueBaseName : ABCMode : d----Name : ABCParent: PowershellExists: TrueRoot : C:FullName : C:PowershellABCExtension :CreationTime : 2011/11/23 17:25:53CreationTimeUtc: 2011/11/23 9:25:53LastAccessTime: 2011/11/23 17:25:53LastAccessTimeUtc : 2011/11/23 9:25:53LastWriteTime : 2011/11/23 17:25:53LastWriteTimeUtc : 2011/11/23 9:25:53Attributes: Directory