比较PowerShell中的文件夹

时间:2015-12-04 11:58:44

标签: powershell

我用它来从PowerShell中递归比较两个文件夹:

http://blogs.technet.com/b/heyscriptingguy/archive/2011/10/08/easily-compare-two-folders-by-using-powershell.aspx

使用这些行:

$fso = Get-ChildItem -Recurse -path C:\test\A
$fsoBU = Get-ChildItem -Recurse -path C:\test\B
Compare-Object -ReferenceObject $fso -DifferenceObject $fsoBU

现在我有一些文件夹应该在文件夹B中被忽略(例如.git)。基于以下答案,我尝试过:

$fso = Get-ChildItem -Recurse -path C:\test\A
$fsoBU = Get-ChildItem -Recurse -path C:\test\B  -Exclude @( "C:\test\B\.git" )
Compare-Object -ReferenceObject $fso -DifferenceObject $fsoBU

确实跳过.git文件夹中的所有文件,但其他所有文件都弹出不同:

enter image description here

我使用Beyond compare检查了文件夹比较,并没有发现任何差异。

2 个答案:

答案 0 :(得分:0)

这应该有效(如果您知道要提前排除的内容):

$fsoBU = Get-ChildItem -Recurse -path C:\test\B -Exclude @( ".nuget", "bin", "obj" )

你可以在同一个命令中使用-Include-Exclude参数,它们接受字符串数组,所以你如何构建它取决于你,上面只是一个简单的例子(支持通配符)两者)。

还要考虑使用-Filter,它是一个字符串但支持通配符等,但是在检索对象之前应用过滤器会更好,而-Include和{{ 1}}之后应用。

答案 1 :(得分:0)

你先生被搞砸了。您并不孤单,大多数使用Get-ChildItem和FileSystem Provider组合工作的人都会遇到这种情况。结果是不一致的,往往会混淆他们改变的原因。例如,在您的情况下,添加-Exclude参数会将命令的输出更改为不只是引用文件,而是引用它们的完整路径。至少可以说这是令人沮丧的。我唯一的建议是这样的:A)当针对FileSystem提供者运行Get-ChildItem时,尽可能使用-Filter参数,B)通过{{1}运行结果提供结果之后的所有其他过滤声明。使用Where-Include从FileSystem提供程序中提取所有结果,然后无论如何都要过滤输出,因此PowerShell正在执行相同的工作,但使用-Exclude语句更灵活,并且更可靠。试试这个:

Where

我敢打赌,这种改变会产生你想要的结果。

更多细节:以上回答了您的问题,但这就是我为此找到的...

创建C:\ Temp \ Test。将File1.csv,File2.csv和File3.csv放在其中。复制该文件夹,并粘贴它,创建所有三个文件的“C:\ Temp \ Test - Copy”。然后我删除了C:\ Temp \ Test - Copy \ File2.csv。我运行了这些命令:

$fso = Get-ChildItem -Recurse -path C:\test\A
$fsoBU = Get-ChildItem -Recurse -path C:\test\B | Where{$_.FullName -notlike "C:\test\B\.git*"}
Compare-Object -ReferenceObject $fso -DifferenceObject $fsoBU

我得到了预期的结果,$dir1 = gci c:\temp\test -recurse $dir2 = gci 'c:\temp\test - copy' -recurse diff $dir1 -dif $dir2 有File2.csv而$dir1没有。好的,现在要过滤掉一些东西......

$dir2

什么是??这是它告诉我的:

$dir1 = gci c:\temp\test -recurse -exclude "file1.csv"
diff $dir1 -dif $dir2

现在为什么只列出InputObject SideIndicator ----------- ------------- File1.csv => File3.csv => C:\temp\test\File2.csv <= C:\temp\test\File3.csv <= 的文件名和$dir2的完整路径?为什么会改变?显然它改变了因为我添加了$dir1参数,但实际上对象是不同的?我们来看看:

-Exclude

是的,所以ImmediateBaseObject列出了我们使用PS:\Temp> $dir1[0].psobject BaseObject : C:\temp\test\File2.csv Members : {System.String PSPath=Microsoft.PowerShell.Core\FileSystem::C:\temp\test\File2.csv, System.String PSParentPath=Microsoft.PowerShell.Core\FileSystem::C:\temp\test, System.String PSChildName=File2.csv, System.Management.Automation.PSDriveInfo PSDrive=C...} Properties : {System.String PSPath=Microsoft.PowerShell.Core\FileSystem::C:\temp\test\File2.csv, System.String PSParentPath=Microsoft.PowerShell.Core\FileSystem::C:\temp\test, System.String PSChildName=File2.csv, System.Management.Automation.PSDriveInfo PSDrive=C...} Methods : {string get_Name(), long get_Length(), string get_DirectoryName(), System.IO.DirectoryInfo get_Directory()...} ImmediateBaseObject : C:\temp\test\File2.csv TypeNames : {System.IO.FileInfo, System.IO.FileSystemInfo, System.MarshalByRefObject, System.Object} PS C:\Temp> $dir2[0].psobject BaseObject : File1.csv Members : {System.String PSPath=Microsoft.PowerShell.Core\FileSystem::C:\temp\Test - Copy\File1.csv, System.String PSParentPath=Microsoft.PowerShell.Core\FileSystem::C:\temp\Test - Copy, System.String PSChildName=File1.csv, System.Management.Automation.PSDriveInfo PSDrive=C...} Properties : {System.String PSPath=Microsoft.PowerShell.Core\FileSystem::C:\temp\Test - Copy\File1.csv, System.String PSParentPath=Microsoft.PowerShell.Core\FileSystem::C:\temp\Test - Copy, System.String PSChildName=File1.csv, System.Management.Automation.PSDriveInfo PSDrive=C...} Methods : {string get_Name(), long get_Length(), string get_DirectoryName(), System.IO.DirectoryInfo get_Directory()...} ImmediateBaseObject : File1.csv TypeNames : {System.IO.FileInfo, System.IO.FileSystemInfo, System.MarshalByRefObject, System.Object} 的结果的完整路径,但没有列出其他结果。对我说,为了应用-Exclude-Include PowerShell必须引用对象的完整路径,但如果你不使用它,它只是引用对象本身。怎么解决这个问题?使用-Exclude语句在收集结果后过滤结果。

这不回答为什么问题?!?,但它确实解释了我是如何到达这里的,并希望将来可以帮助您排除类似问题。有时候,弄清楚如何使用你拥有的东西然后找出它的工作方式更为重要。