2017-07-25 83 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