2017-07-25 84 views
3

最容易的代碼片段來解釋這個問題...比較-對象:PassThru參數改變輸入變量

Clear-Host 

$refObj = New-Object System.Object 
$refObj | Add-Member -MemberType NoteProperty -Name ObjectMember1 -Value 123 

$diffObj = New-Object System.Object 
$diffObj | Add-Member -MemberType NoteProperty -Name ObjectMember1 -Value 456 


Write-Output 'Before 1st comparison...' 
$refObj | Get-Member | ? { $_.MemberType -eq 'NoteProperty' } | Select * 


$x = Compare-Object -ReferenceObject $refObj -DifferenceObject $diffObj -IncludeEqual 

Write-Output 'After 1st comparison...' 
$refObj | Get-Member | ? { $_.MemberType -eq 'NoteProperty' } | Select * 


$y = Compare-Object -ReferenceObject $refObj -DifferenceObject $diffObj -PassThru -IncludeEqual 

Write-Output 'After 2nd comparison...' 
$refObj | Get-Member | ? { $_.MemberType -eq 'NoteProperty' } | Select * 

...和結果(似乎是PS版本3和5相同的,沒有測試任何其他人)...

Query results

我正在努力理解就是爲什麼-PassThru參數列入正在改變輸入變量之一,通過增加一個額外的參數。

除了努力去理解爲什麼會發生這種情況,我想避免它。是否有一種方法可以在不更改輸入變量的情況下爲Compare-Object cmdlet指定輸出變量?

在此先感謝。

編輯:現在很清楚,這個問題還不夠清楚。爲了使這個更簡單....

$y = Compare-Object -ReferenceObject $refObj -DifferenceObject $diffObj -PassThru -IncludeEqual 

上述內容,如何停止添加到$ refObj SideIndicator,並把它添加到$ Y呢?似乎沒有比較對象的-OutVariable選項,是否有另一種方法可以做到這一點?

編輯2: 原來存在於比較-對象的-OutVariable選擇,但它似乎並沒有工作...

Compare-Object -ReferenceObject $refObj -DifferenceObject $diffObj -IncludeEqual -PassThru -OutVariable $objComparisonResults 

我希望在$ objComparisonResults數據,但沒有數據保存在這個變量中。

回答

1

Compare-Object總是添加SideIndicator NoteProperty。看看產生的物體。 PowerShell生成對象,而不是要解析的平面文本。使用-PassThru只是導致它出現在控制檯輸出中。

Clear-Host 
$logfile = 'C:\src\t\pt.txt' 
if (Test-Path -Path $logfile) { Remove-Item -Path $logfile } 

$refObj = New-Object System.Object 
$refObj | Add-Member -MemberType NoteProperty -Name ObjectMember1 -Value 123 

$diffObj = New-Object System.Object 
$diffObj | Add-Member -MemberType NoteProperty -Name ObjectMember1 -Value 456 


'Before 1st comparison...' | Out-File -FilePath $logfile -Append -Encoding Ascii 

$refObj | Get-Member | ? { $_.MemberType -eq 'NoteProperty' } | Select * | gm | 
    Out-File -FilePath $logfile -Append -Encoding Ascii 


$x = Compare-Object -ReferenceObject $refObj -DifferenceObject $diffObj -IncludeEqual | gm | 
    Out-File -FilePath $logfile -Append -Encoding Ascii 

'After 1st comparison...' | Out-File -FilePath $logfile -Append -Encoding Ascii 

$refObj | Get-Member | ? { $_.MemberType -eq 'NoteProperty' } | Select * | gm | 
    Out-File -FilePath $logfile -Append -Encoding Ascii 


$y = Compare-Object -ReferenceObject $refObj -DifferenceObject $diffObj -PassThru -IncludeEqual | gm | 
    Out-File -FilePath $logfile -Append -Encoding Ascii 

'After 2nd comparison...' | Out-File -FilePath $logfile -Append -Encoding Ascii 

$refObj | Get-Member | ? { $_.MemberType -eq 'NoteProperty' } | Select * | gm | 
    Out-File -FilePath $logfile -Append -Encoding Ascii 
+0

謝謝你的迴應lit.我認爲我沒有妥善處理這個問題,因爲我的主要問題不是SideIndicator被添加到對象中,而是能夠控制它添加到的對象。我將編輯該問題。 – ZenoArrow

+0

使用'-PassThru'時,'SideIndicator'屬性被添加到結果中的每個對象。原始的ReferenceObject和DifferenceObject保持不變。如果對象在DifferenceObject中是新的,則它將在帶有SideIndicator的結果中。 – lit

0

找到了解決辦法。而不是試圖挽救比較,結果對象在這樣一個變量...

$y = Compare-Object -ReferenceObject $refObj -DifferenceObject $diffObj -PassThru -IncludeEqual 

...可以將結果保存這樣...

$y = (Compare-Object -ReferenceObject $file1 -DifferenceObject $file2 -Property $properties1 -IncludeEqual) 

這第二種方式中,輸出保存在$ y中,並且當-PassThru被跳過時,我們應該避免將更改保存回輸入變量。

作爲進一步的改進,可以使用Tee-Object將輸出存儲在變量中,這也允許我們控制比較對象輸出是否自動顯示在屏幕上(下面命令中的Out-Null意味着此輸出被抑制):

(Compare-Object -ReferenceObject $refObj -DifferenceObject $diffObj -IncludeEqual) | Tee-Object -Variable y | Out-Null