Powershell 比较对象:PassThru参数改变输入变量

Powershell 比较对象:PassThru参数改变输入变量,powershell,Powershell,最简单的解释这个问题的代码片段 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

最简单的解释这个问题的代码片段

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中似乎是相同的,没有测试任何其他版本)

我很难理解为什么包含-PassThru参数会通过添加一个额外的参数来改变一个输入变量

除了努力理解为什么会发生这种情况之外,我想避免它。是否有一种方法可以在不更改输入变量的情况下为Compare Object cmdlet指定输出变量

提前谢谢

编辑:我现在很清楚,这个问题还不够清楚。为了让这更简单

$y = Compare-Object -ReferenceObject $refObj -DifferenceObject $diffObj -PassThru -IncludeEqual
有了以上内容,我如何停止将SideIndicator添加到$refObj,而将其添加到$y?比较对象似乎没有-OutVariable选项,有没有其他方法可以做到这一点

编辑2: 事实证明,Compare对象有一个-OutVariable选项,但它似乎不起作用

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

我希望$objComparisonResults中包含数据,但此变量中未保存任何数据。

Compare Object
始终添加
SideIndicator
note属性。看一看制作的物品。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

找到了解决办法。而不是试图以这种方式将比较对象结果保存在变量中

$y = Compare-Object -ReferenceObject $refObj -DifferenceObject $diffObj -PassThru -IncludeEqual
。。。可以这样保存结果

$y = (Compare-Object -ReferenceObject $file1 -DifferenceObject $file2 -Property $properties1 -IncludeEqual)
第二种方法是,输出保存在$y中,由于跳过了-PassThru,我们应该避免将更改保存回输入变量

作为进一步改进,可以使用Tee对象将输出存储在变量中,这也允许我们控制比较对象输出是否自动显示在屏幕上(下面命令中的Out Null表示此输出被抑制):


谢谢你的回复。我认为我没有正确地表达这个问题,因为我的主要问题不是SideIndicator被添加到一个对象,而是能够控制它被添加到哪个对象。我将编辑问题。当使用
-PassThru
时,
SideIndicator
属性将添加到结果中的每个对象。原始引用对象和差异对象不变。如果该对象在DifferenceObject中是新的,则它将在结果中包含一个SideIndicator。
(Compare-Object -ReferenceObject $refObj -DifferenceObject $diffObj -IncludeEqual) | Tee-Object -Variable y | Out-Null