相关疑难解决方法(0)

当一个调用只返回一个对象时,如何强制Powershell返回一个数组呢?

我正在使用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"是对象而不是集合?

powershell

105
推荐指数
4
解决办法
5万
查看次数

在PowerShell中返回具有单个元素的数组

这应该很简单——我需要从一个函数返回一个哈希表数组。这在有多个哈希表时有效,但当只有一个时,结果不是数组。我宁愿不测试结果是否为数组。

function GetArrayWith1Hashtable()
{
    $array = @()

    $hashtable = @{}
    $hashtable["a"] = "a" 
    $hashtable["b"] = "b" 
    $hashtable["c"] = "c"
    $array += $hashtable 

    Write-Host "GetArrayWith1Hashtable array.Length =" $array.Length
    Write-Host "GetArrayWith1Hashtable array.Count" $array.Count
    Write-Host "GetArrayWith1Hashtable array[0].Keys" $array[0].Keys

    $array
}

function GetArrayWith2Hashtables()
{
    $array = @()

    $hashtable = @{}
    $hashtable["a"] = "a" 
    $hashtable["b"] = "b" 
    $hashtable["c"] = "c"
    $array += $hashtable 

    $hashtable2 = @{}
    $hashtable2["d"] = "d" 
    $hashtable2["e"] = "e"
    $hashtable2["f"] = "f"
    $array += $hashtable2 

    Write-Host "GetArrayWith2Hashtables array.Length = " $array.Length
    Write-Host …
Run Code Online (Sandbox Code Playgroud)

arrays powershell hashtable powershell-5.0

5
推荐指数
2
解决办法
2225
查看次数

如何强制函数返回单个元素数组而不是包含的对象?

我有一个函数(实际上是这个函数的多个实例),但有时它可能返回多个元素的列表,有时它可能返回单个元素。我希望该函数每次都返回一个数组 ( [System.Object[]]),以便(在接收端)我始终可以预期它是一个数组并对其进行索引,即使我只是拉取第 0 个元素。

我尝试过以多种方式转换返回类型(参见下面的代码)...包括(例如)return @("asdf")return [System.Object[]]@("asdf")类似的,但似乎唯一获得一致行为的方法是在数组中添加第二个空元素.. ..这对我来说感觉不对。(见下面的代码)

function fn1 {
    return @("asdf")
}

function fn2 {
    return [array]@("asdf")
}

function fn3 {
    return [System.Object[]]@("asdf")
}

function fn4 {
    # This works but with the side effect of sending a null string that is not actually necessary
    return @("asdf",$Null)
}

$v = fn1            # Same for fn2, fn3.
$v.GetType().Name   # Expected: Object[], Actual: String
$v[0]               # Expected: "asdf", Actual: "a"

$v = fn4
$v.GetType().Name …
Run Code Online (Sandbox Code Playgroud)

powershell powershell-5.0

3
推荐指数
1
解决办法
287
查看次数

标签 统计

powershell ×3

powershell-5.0 ×2

arrays ×1

hashtable ×1