这是我试图执行的代码
$objDir = Get-ChildItem "C:\Users\Bruce\Serena\"
$objFile = Get-Content "C:\Users\Bruce\process.txt"
$matches = (Compare-Object -ReferenceObject $objFile -DifferenceObject $objDir -Property Name,Length -excludedifferent -includeequal)
foreach ($file in $matches)
{
Remove-Item C:\Users\Bruce\Serena\$($file.Name)
}
我想从目录中删除目录和txt文件中相同的所有项目,这段代码会这样做吗?
答案 0 :(得分:1)
如果没有看到 process.txt 中的数据格式,很难说出应该做什么,但我可以明确地告诉你,调用比较 - 关于 Get-ChildItem 和 Get-Content 结果的对象不可能正常工作,因为前者返回一个FileInfo对象数组,后者返回一个字符串数组(如果文件只有一行,则只是一个字符串)。
Compare-Object 主要用于比较相同类型的对象集,但它可用于比较具有公共属性名称的对象集。但是,在后一种情况下,属性需要具有相同类型的信息,而不仅仅是相同的名称,以使比较有意义。
无法猜测 $ objFile 中字符串中的哪些内容与 $ objDir 中的FileInfo对象的属性进行比较。这些对象类型的唯一属性名称是长度,但该属性上的任何匹配都是无意义的(并且非常不可能)巧合,因为它们具有完全不同的含义 - 字符串中的字符数,以及文件的大小(以字节为单位)。
应如何取决于您在 process.txt 中的数据类型。如果它只是一个文件名列表,那就像
一样简单foreach ($file in (Get-Content 'C:\Users\Bruce\process.txt')) {
Remove-Item -ErrorAction SilentlyContinue "C:\Users\Bruce\Serena\$file"
}
如果它是包含每个文件的名称和大小的CSV文件,那么您可以使用 Import-Csv 而不是 Get-Content 将数据导入一个具有属性的对象数组,您可以将其与目录列表进行比较,但在获取特定内容之前,我需要查看一些示例数据。