【问题标题】:Powershell GCI Recursive Depth Stops Working When Adding Include Parameter添加包含参数时,Powershell GCI 递归深度停止工作
【发布时间】: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 个不同的共享。我知道这很奇怪,是的,我必须为我们的基础设施这样做。

【问题讨论】:

  • 您可以尝试通过管道连接到Where-Object 而不是使用-Include 开关吗?在severalother 位置,似乎人们在使用某些-Depth 开关时遇到了问题。
  • 正如@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


【解决方案1】:

切换到在 Windows Server 2012 R2 机器上运行后,深度参数与包含一起使用。这似乎是我使用的版本的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2020-09-24
    • 2021-10-28
    • 1970-01-01
    • 2016-02-24
    • 2013-05-16
    相关资源
    最近更新 更多