【发布时间】:2017-06-06 03:54:23
【问题描述】:
我有一个简单的问题。我已经编写了一大段代码。简而言之,它会下载文件名和扩展名的动态列表,导入包含每个共享根目录的 csv,然后比较文件以查找匹配项。
$Directory = Get-ChildItem -Path $path -Recurse -Depth 2 -Include $ExtList -Force
超级简单,对吧?除了深度参数不起作用。它递归地搜索每个级别。如果我这样做:
$Directory = Get-ChildItem -Path $path -Depth 2 -Force
Depth 参数完美运行,它只搜索两个级别。如果我不包括递归或深度,它只搜索顶层就可以按预期工作。唯一的区别是我删除了 -Include 参数。
$Path 是一个类似于 \server\root\ 的变量 $ExtList 是一个文件名数组
同样,它们都单独工作,但不能一起工作。
我需要在此处同时具有深度和包含参数。有谁知道我做错了什么,或者这是一个小故障?
编辑---------------
做“Where-Object”我试过这个:
$Directory = Get-ChildItem -Path $path -Recurse -Depth 2 -Force | Where-Object {$_.Extension -like $ExtList}
然后……什么也没有发生。对于测试,这个脚本需要大约 10 分钟才能在好的一天成功运行,不到 1 秒就完成了。 (准确地说是 715 毫秒) 当我进入调试时,就好像没有任何东西被输送到 where-object 中。
编辑------
$ExtList 设置如下所示:
@((Invoke-WebRequest -Uri "https://fsrm.experiant.ca/api/v1/get").content | convertfrom-json | % {$_.filters})
这将为您提供我正在使用的确切列表和格式。
$Path 从如下所示的 csv 文件中提取:
此 CSV 中有超过 3000 个不同的共享。我知道这很奇怪,是的,我必须为我们的基础设施这样做。
【问题讨论】:
-
正如@gravity 建议的那样,改为通过管道传送到
Where。您不应该失去任何性能,因为-Include参数从提供程序获取所有结果,然后过滤到指定的包含。 -
所以。我对 Where 不太熟悉,但是当我添加
| Where-Object {$_.Name -eq $ExtList -or $_.Extension -eq $ExtList}时,什么也没有发生。当我进入调试器时,就好像变量没有通过。 @gravity @TheMadTechnician -
不要使用
-eq- use either-match或-like。您正在相互比较字符串,即使它们实际上是相同的(即:.ext和.ext),您仍然会经常看到-eq失败...(单击链接查看细分-match和-like之间的区别。我更喜欢-match进行精确比较,我知道它是静态的。 -
@gravity 我编辑了帖子以包括我正在做的事情......也许你可以引导我朝着我做错的方向前进。
标签: powershell recursion get-childitem powershell-5.0