我用它来从PowerShell中递归比较两个文件夹:
使用这些行:
$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文件夹中的所有文件,但其他所有文件都弹出不同:
我使用Beyond compare检查了文件夹比较,并没有发现任何差异。
答案 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
语句在收集结果后过滤结果。
这不回答为什么问题?!?,但它确实解释了我是如何到达这里的,并希望将来可以帮助您排除类似问题。有时候,弄清楚如何使用你拥有的东西然后找出它的工作方式更为重要。