我将变量设置为对象,如下所示:
[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()';
}
答案 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[]