正如我在PowerShell用户指南中所读到的,PowerShell的核心概念之一是命令接受并返回对象而不是文本.例如,运行会get-alias返回许多System.Management.Automation.AliasInfo对象:
PS Z:\> get-alias CommandType Name Definition ----------- ---- ---------- Alias % ForEach-Object Alias ? Where-Object Alias ac Add-Content Alias asnp Add-PSSnapIn Alias cat Get-Content Alias cd Set-Location Alias chdir Set-Location ...
现在,我如何获得这些对象的数量?
我正在使用Powershell在Web服务器上设置IIS绑定,并且遇到以下代码的问题:
$serverIps = gwmi Win32_NetworkAdapterConfiguration
| Where { $_.IPAddress }
| Select -Expand IPAddress
| Where { $_ -like '*.*.*.*' }
| Sort
if ($serverIps.length -le 1) {
Write-Host "You need at least 2 IP addresses for this to work!"
exit
}
$primaryIp = $serverIps[0]
$secondaryIp = $serverIps[1]
Run Code Online (Sandbox Code Playgroud)
如果服务器上有2个以上的IP,那么很好 - Powershell返回一个数组,我可以查询数组长度并提取第一个和第二个地址就好了.
问题是 - 如果只有一个IP,Powershell不返回单元素数组,它返回IP地址(作为字符串,如"192.168.0.100") - 字符串有一个.length属性,它大于1,所以测试通过,我最后得到字符串中的前两个字符,而不是集合中的前两个IP地址.
如何强制Powershell返回单元素集合,或者确定返回的"thing"是对象而不是集合?
$cars = "bmw","audi","volvo","vw"
echo $cars.length
Run Code Online (Sandbox Code Playgroud)
返回4,但是
$cars = "bmw"
Run Code Online (Sandbox Code Playgroud)
返回3因为它计算字符..
如果数组只包含一个项目,有没有办法可以返回1?
比较下面的三个脚本:
样品1
$a = GPS | Where {$_.ProcessName -Match 'AcroRd32'}
$a
$a.Count
If ($a.Count -Eq 0)
{
Echo "Adobe Reader is Off"
}
Else
{
Echo "Adobe Reader is On"
}
# If Adobe Reader is not running, how come 0 (zero) is not returned?
# This is prettier, should I use it? Or does it slow down performance?
Run Code Online (Sandbox Code Playgroud)
样本2
$a = GPS AcroRd32
$a
$a.Count
If ($a.Count -Eq 0)
{
Echo "Adobe Reader is Off"
}
Else
{
Echo …Run Code Online (Sandbox Code Playgroud)