2016-08-13 101 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()'; 
} 
相關問題