对象变量更改为字符串

时间:2016-08-13 11:10:13

标签: powershell

我将变量设置为对象,如下所示:

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

如果我查看现在的$ x,我得到:

acb
def

现在我的问题是当我将$ x设置为$ null然后尝试在读取文件时使用+ =从循环设置$ x它将$ x type更改为字符串并且如果我查看$ x现在是什么它给了我:

abcdef

而不是:

abc
def

如何将变量保持为对象而不是字符串?

以下只是一个获得想法的示例:

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

$x = $null;

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

2 个答案:

答案 0 :(得分:3)

您在代码中执行的操作是:

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

==> 'abc'和'def'的类型是[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扩展类型系统的更多信息,请阅读。

以下代码段有效。希望有所帮助。

############################################
# 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()';
}

答案 1 :(得分:2)

在底层类型系统(.NET CTS)中,grid("off","on");是任何对象的基类,并且是可以给出任何变量的最模糊的类型描述 - 它没有传达任何专门的含义一点都不。

@PatM0's answer中所述,此处的最佳解决方案是在使用off之前使用数组子表达式运算符(on)初始化变量值:

[object]

如果您真的想强制变量成为集合类型,请使用@()+=类型加速器:

$x = @()

array比较:

psobject[]