Powershell 对象变量更改为字符串

Powershell 对象变量更改为字符串,powershell,Powershell,我有一个变量集作为对象,如下所示: [object] $x = 'abc','def'; 如果我现在查看$x是什么,我会得到: acb def 现在我的问题是,当我将$x设置为$null,然后尝试使用+=从循环中设置$x时,读取文件后,它会将$x类型更改为字符串,如果我查看$x现在是什么,它会给出: abcdef 而不是: abc def 如何将变量保持为对象而不是字符串 以下只是一个示例,以了解该想法: [object] $x = 'abc','def'; $x = $null;

我有一个变量集作为对象,如下所示:

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

您在代码中所做的是:

[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类型。可以重新定义字符串等

在供您使用的循环中

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

您在代码中所做的是:

[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类型。可以重新定义字符串等

在供您使用的循环中

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

在底层类型系统(.NET CTS)中,
[object]
是任何对象的基类,是您可以给出的任何变量的最模糊的类型描述,它根本不传递任何专门的含义

如中所述,这里的最佳解决方案是在使用
+=
之前使用数组子表达式运算符(
@()
)初始化变量值:

$x = @()

如果确实要强制变量成为集合类型,请使用
array
psobject[]
类型加速器:

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
[对象]
比较:

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

在底层类型系统(.NET CTS)中,
[object]
是任何对象的基类,是您可以给出的任何变量的最模糊的类型描述,它根本不传递任何专门的含义

如中所述,这里的最佳解决方案是在使用
+=
之前使用数组子表达式运算符(
@()
)初始化变量值:

$x = @()

如果确实要强制变量成为集合类型,请使用
array
psobject[]
类型加速器:

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
[对象]
比较:

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

谢谢你的回复。它将它作为一个对象进行保存,但在动态中,它仍然可以看到与您键入时不同的对象。等待要完成评论,我相信我之前已经告诉过你了,但是你所采用的方法(构建和调用命令字符串)是不必要的复杂和复杂。您最好将时间花在调整代码以适应我在回复您上一个问题时发布的内容上,而不是花在解决所有陷阱和问题上,如果您继续此路线,这些陷阱和问题将不可避免地出现。谢谢您的回复。它将它作为一个对象进行保存,但在动态中,它仍然可以看到与您键入时不同的对象。等待要完成评论,我相信我之前已经告诉过你了,但是你所采用的方法(构建和调用命令字符串)是不必要的复杂和复杂。你最好把时间花在调整你的代码上,使之符合我在回答你最后一个问题时发布的内容,而不是去解决所有的陷阱和问题,如果你继续这样做,这些陷阱和问题将不可避免地出现。