在powershell中使用Compare-Object时出错

时间:2015-11-16 15:00:57

标签: powershell

我正在尝试使用Compare-Object cmdlet运行两个文件的差异,并在与第一个文件(master.txt)进行比较时打印第二个文件(slave.txt)中缺少的文件。在这个例子中,我想打印user.txt中的user1,user3,但不存在于slave.txt中。我有一个先决条件,将文件中的每个值存储为变量,因此" mobj"和" sobj"不容忽视。

运行脚本时发现此错误。这可能是什么问题?

~]# cat master.txt
user1
user2
user3

~]# cat slave.txt
user2
user4

代码:

$mfile = Get-Content "C:\master.txt"
$sfile = Get-Content "C:\slave.txt" 
foreach ($mobj in $mfile) {

foreach($sobj in $sfile){
        Compare-Object (ls $mobj) (ls $sobj) -Property Name, Length, LastWriteTime -passthru | Where { $_.PSParentPath -eq (gi $mobj).PSPath } 

    }
}

报告的错误是:

Compare-Object : Cannot bind argument to parameter 'ReferenceObject' because it is null.

2 个答案:

答案 0 :(得分:1)

呃,不是你上一个问题的意思。仅仅因为该问题被标记为重复并不意味着您必须使用完全未经修改的代码

试试这个:

$mfile = Get-Content "C:\master.txt"
$sfile = Get-Content "C:\slave.txt" 

#In master.txt not in slave.txt
Compare-Object $mfile $sfile | Where-Object { $_.SideIndicator -eq '<=' } | Select-Object -ExpandProperty InputObject

#In slave.txt not in master.txt
Compare-Object $mfile $sfile | Where-Object { $_.SideIndicator -eq '=>' } | Select-Object -ExpandProperty InputObject

答案 1 :(得分:0)

从用户文件夹所在的目录开始运行代码,或者需要编辑主文件和从属文件。

您运行LS/Dir并且未在找到用户配置文件的源目录中执行,或者在源文件中明确指定其配置文件的完整路径,您将遇到此错误,因为如果无法找到目录,LS将抛出一个非终止错误(解释为null,因为没有数据或对象进入stdout /管道)。