过滤器参数的Get-ChildItem实现中的FileSystem Provider错误?

时间:2017-09-25 10:38:19

标签: powershell

最近我要通过PowerShell创建一个关于位于*.inf文件夹中的C:\Windows\winsxs文件的报告,其中包含Filter Get-ChildItem参数$infFiles = Get-ChildItem -Path C:\Windows\winsxs -Filter *.inf -Recurse (请参阅有关{的官方文档{3}}),如:

.inf_loc

但我注意到,结果中还包含其他文件扩展名的文件,例如.inf_dbf42768Include

另一方面,.inf参数按预期工作,仅返回$infFiles = Get-ChildItem -Path C:\Windows\winsxs -Include *.inf -Recurse 个文件:

Filter

我已经使用PS版本3和4测试了这种现象,并发现,如果你要查找的扩展名正好比任何文件都要3个字符,那么这些扩展名以相同的3个字符开头,即使是那些文件的扩展名较长。如果您要查找的扩展名短于或长于3个字符,则根据我的经验,至少没有此类问题。

虽然性能在我的情况下并不重要,但据我所知,使用Include参数比numOfAdults = testRunner.testCase.testSuite.getPropertyValue("NumberOfAdults").toInteger() numOfChildren = testRunner.testCase.testSuite.getPropertyValue("NumberOfChildren").toInteger() numOfInfants = testRunner.testCase.testSuite.getPropertyValue("NumberOfInfants").toInteger() totalPax = numOfAdults + numOfChildren + numOfInfants firstName = "Firstname" surname = "Surname" emailAdd = "firstname" + ".surname@random.com" adultTitle = ["Mr","Mrs","Miss","Ms"].sort{new Random()}?.take(1)[0] infantTitle = ["Mstr","Miss"].sort{new Random()}?.take(1)[0] gender = ["Female","Male"].sort{new Random()}?.take(1)[0] log.info "Total Pax " + totalPax def passengersXML = "" def passengerXML = """ <Passenger> <DateOfBirth>2001-01-05T09:24:39.7911558+00:00</DateOfBirth> <EmailAddress>FirstNameOne.SurnameOne@random.com</EmailAddress> <FirstName>$firstName</FirstName> <Gender>$gender</Gender> <PassengerNum>1</PassengerNum> <PersonGuid>abcdefghijklmno</PersonGuid> <Surname>SurnameOne</Surname> <Title>Miss</Title> <Type>Adult</Type> </Passenger> """ for (i = 1; i <=numOfAdults; i++){ passengersXML += passengerXML } // // for (i = 1; i <=numOfChildren; i++){ passengersXML += passengerXML } // // for (i = 1; i <=numOfInfants; i++){ passengersXML += passengerXML } def langs = new XmlParser().parseText(passengerXML) log.info passengersXML testRunner.testCase.testSuite.setPropertyValue("PassengerResponse", passengerXML) 参数更有效,因为它已经在提供程序级别执行过滤,如this cmdlet and its parameters

中所述
  

过滤器比其他参数更有效,因为提供者   在检索对象时应用它们,而不是使用Windows   PowerShell在检索对象后对其进行过滤。

cmdlet description

  

... -Filter参数生成早期的早期过滤,   而 - 包含是后来的早期过滤!性能差异   这两种方法之间的结果非常重要!

是记录在案的行为/错误吗?我在here中也发现了类似的内容,但在官方文档中却没有。

1 个答案:

答案 0 :(得分:1)

根据链接的问题,这似乎是-Filter参数的限制。我想另一个解决方案是仍然使用-Filter来获得性能优势,但之后使用Where-Object过滤掉您不想要的额外结果:

Get-ChildItem -filter "*.inf" | where {$_ -match "\.inf$"}

这使用正则表达式$字符仅返回字符串末尾.inf的位置。