2016-08-13 55 views
0

我有一个变量设置为对象如下:对象变量的变化为一个字符串

[object] $x = 'abc','def'; 

如果我认为x是什么$现在,我得到:

acb 
def 

现在我的问题是当我将$ x设置为$ null,然后在读取文件后尝试使用+ =来设置$ x,它将$ x类型更改为一个字符串,如果我查看$ x现在是什么给了我:

abcdef 

而不是:

abc 
def 

我该如何去把变量保留为对象而不是字符串?

下面仅仅是一个样品得到的想法:

[object] $x = 'abc','def'; 

$x = $null; 

for ($i = 0; $i -lt $numberOfColumns; $i++) { 
    $x += '$_.' + $NamesOfColumns[$i] + '.Trim()'; 
} 
+0

谢谢你的回复。它在保持它作为一个对象的工作,但动态它仍然看到对象不同,当你键入它。等待..完成评论仍然输入 –

+0

我相信我告诉过你,但你采取的方法(建设和调用命令字符串)是不必要的复杂和令人费解。将代码调整到我为回应最后一个问题而发布的内容时,您的时间将会更长*而不是解决所有如果继续此路线将不可避免地弹出的陷阱和问题。 –

回答

2

在底层的类型系统(CTS .NET),[object]为任何对象的基类,并且是最模糊的类型描述,你可以给任何变量 - 它没有传达任何专门的意义了。

正如@PatM0's answer提到的,在这里最好的解决办法是使用+=前初始化数组子表达式运算符(@())变量值:

$x = @() 

如果你真的想强制变量是一个集合类型,使用arraypsobject[]类型的加速器:

PS C:\> [array]$x = 'abc','def' 
PS C:\> $x = $null 
PS C:\> $x += 'abc' 
PS C:\> $x += 'def' 
PS C:\> $x 
abc 
def 
PS C:\> [psobject[]]$x = 'abc','def' 
PS C:\> $x = $null 
PS C:\> $x += 'abc' 
PS C:\> $x += 'def' 
PS C:\> $x 
abc 
def 

[object]比较:

PS C:\> [object]$x = 'abc','def' 
PS C:\> $x = $null 
PS C:\> $x += 'abc' 
PS C:\> $x += 'def' 
PS C:\> $x 
abcdef 
3

你自己的代码中做的是:

[object] $x = 'abc', 'def' 

==>类型 'ABC' 和 '高清' 是[System.String]。因为你用逗号分隔它们,PowerShell会自动创建一个列表。所以执行该行$ x是一个System.Object []。索引0和1包含[System.String]。

$x = $null; 

==>现在您定义$ null作为$ x的值。所以你正在消除价值。 $ x的类型现在未发现。您可以设置值123,然后$ x将变成类型System.Int32。你可以重新定义一个字符串等等。

在你的for循环使用

$x += 'somestring' + $addingSomeStuff + 'otherstring' 

==>这里的结果是,for循环的PowerShell的第一次迭代内将一个字符串赋值给$ x。所以$ x的类型将是[System.String]。在下一次迭代中,+ =运算符将额外内容添加到$ x的值,该值仍然是[System.String]

不要将$ x设置为$ null。因为你会丢失类型信息。有关更多信息,请阅读PowerShell Extended Type System。

以下片段适用。希望有所帮助。

############################################ 
# The following was not part of your post # 
# I added it to get it run in general # 
$numberOfColumns = 2 
$NamesOfColumns = 'Column1', 'Column2' 
############################################ 

[object] $x = 'abc','def'; 

# don't set $x to $null 
# define an empty list instead ;-) 
$x = @() 

for ($i = 0; $i -lt $numberOfColumns; $i++) { 
    $x += '$_.' + $NamesOfColumns[$i] + '.Trim()'; 
} 
相关问题