Array返回第一个元素char而不是整个元素

时间:2016-11-28 06:37:29

标签: arrays powershell

我定义了Array

function GetNames
{
    $names = New-Object System.Collections.ArrayList
    $names += "Drin"
    $names
}

现在我想从Array

中取名
$names = GetNames
$firstName = $names[0]

所以现在$firstName而不是接收Drin我得到了D

3 个答案:

答案 0 :(得分:1)

如果使用$names检索GetType()的类型,您将看到$names实际上是一个字符串 - 因此,如果您访问第一个索引,则会获得第一个字符:

IsPublic IsSerial Name                                     BaseType 
-------- -------- ----                                     --------
True     True     String                                   System.Object

注意:这是因为您在管道中只有单个元素。要强制$names成为数组,您必须显式声明它:

$names = @(GetNames)

另请注意,您不必使用New-Object来创建阵列。您也可以使用以下方式声明它:

function GetNames
{
    @('Drin')
}

答案 1 :(得分:0)

如果您按原样运行代码,但在每行之间添加Here is my code : Set fso = CreateObject("Scripting.FileSystemObject") Set ts = fso.OpenTextFile("C:\apace-jmeter-3\bin\Results\outcome.zip", 2, True) ts.Write "PK" & Chr(5) & Chr(6) & String( 18, Chr(0) ) Set fso = nothing Set ts = nothing WScript.Sleep 5000 Set objShell = CreateObject("Shell.Application") Set DestFldr=objShell.NameSpace("C:\apace-jmeter-3\bin\Results\outcome.zip") Set SrcFldr=objShell.NameSpace("C:\Users\chitra.balasubramani\Desktop\Mail") DestFldr.CopyHere SrcFldr ,则可以获得此代码:

$names.GetType()

通过调用$names = New-Object System.Collections.ArrayList $names.GetType() $names += "Drin" $names.GetType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True ArrayList System.Object True True Object[] System.Array ,您重新定义了$names += "Drin"的类型。它不直观(至少对我来说是一个C#dev),但这就是发生的事情。

如果你使用$names方法,那么它可以正常工作:

.Add(...)

这给出了:

IsPublic IsSerial Name                                     BaseType                                                                                                                           
-------- -------- ----                                     --------                                                                                                                           
True     True     ArrayList                                System.Object                                                                                                                      
0
True     True     ArrayList                                System.Object                                                                                                                      
Drin

$names = New-Object System.Collections.ArrayList $names.GetType() $names.Add("Drin") $names.GetType() $names[0] 的类型保持不变,您可以获得正确的结果。

正确的方法是避免使用$names(毕竟是2001年)。而是用ArrayList来做。试试这个:

@()

这给出了:

IsPublic IsSerial Name                                     BaseType                                                                                                                           
-------- -------- ----                                     --------                                                                                                                           
True     True     Object[]                                 System.Array                                                                                                                       
True     True     Object[]                                 System.Array                                                                                                                       
Drin

正如Martin在评论中指出的那样,函数应如下所示:

$names = @()
$names.GetType()
$names += "Drin"
$names.GetType()
$names[0]

答案 2 :(得分:0)

不幸的是,有时唯一的解决方案是将变量声明为 [array] 并使用 +=(不带空格) 当数组仅填充 one 值时,我无法看到带有 $arg.id[0] 的整个元素。

工作:[array]$arg+=(Get-AzApplicationGateway)

工作:[array]$arg += (Get-AzApplicationGateway)

只有这会给我返回 $arg.id[0] 的第一个元素,而不仅仅是字符串的第一个字符。 这看起来确实有问题,事实上它只在 $PSVersionTable 5.1.19041.906

中对我来说没有空格