【问题标题】:How to limiting files searched by Get-ChildItem (or limiting depth of recursion)?如何限制 Get-ChildItem 搜索的文件(或限制递归深度)?
【发布时间】:2013-02-07 00:15:39
【问题描述】:

背景

有一个目录会全天自动填充 MSI 文件。我计划利用任务计划程序每 15 分钟运行一次如下所示的脚本。该脚本将搜索目录并将过去 15 分钟内创建的所有新 MSI 复制到网络共享。

在此文件夹 C:\ProgramData\flx\Output\<APP-NAME>\_<TIME_STAMP>\<APP-NAME>\ 中还有另外两个文件夹:Repackaged 和 MSI Package。 Repackaged 文件夹不需要搜索,因为它不包含任何 MSI。我还发现需要以某种方式排除它以防止出现此错误:

Get-ChildItem : The specified path, file name, or both are too long. The fully qualified file name must be less than 260 characters, and the directory name must be less than 248 characters.
At line:14 char:32
+$listofFiles=(Get-ChildItem <<<< -Recurse -Path $outputPath -Include "*.msi" -Exclude "*.Context.msi" | where {$_.LastAccessTime -gt $time.AddMinutes($minutes)})
+ CategoryInfo : ReadError: C:\ProgramData\...xcellence\Leg 1:String) [Get-ChildItem], PathTooLongException
+ FullyQualifiedErrorId : DirIOError,Microsoft.PowerShell.Commands.GetChildItemCommand

限制

  • 我在使用 Powershell v1.0 时卡住了
  • 我无法控制源位置的目录结构

更新:

  • 我不知道应用程序名称或时间戳。那是我无法控制的其他事情。

目前的计划

我已经阅读了有关使用 -Filter 的信息,并且我知道过滤器类似于函数,但我无法想出如何使用它们的任何想法。我目前唯一的想法是做类似的事情:

$searchList=Get-ChildItem "all instances of the MSI Package folder"

foreach($folder in $searchList){
    $listofFiles=Get-ChildItem "search for *.msi"

    foreach($file in $listofFiles){"Logic to copy MSI from source to destination"}
}

但是...我认为可能有更有效的方法来做到这一点。

问题

  1. 如何限制 Get-ChildItem 搜索的深度?
  2. 如何将 Get-ChildItem 搜索限制为 C:\ProgramData\flx\Output\&lt;APP-NAME&gt;_&lt;TIME_STAMP&gt;\&lt;APP-NAME&gt;\MSI Package
  3. 如何仅搜索在过去 15 分钟内访问过的文件夹?当我知道 MSI 已被复制时,我不想浪费时间深入文件夹。

对于如何使该脚本整体更高效的任何其他建议也将不胜感激。

脚本

我当前的脚本可以在here 找到。我不断收到:“您的帖子似乎包含未正确格式化为代码的代码”并在第四次尝试重新格式化后放弃了。

【问题讨论】:

    标签: powershell filter powershell-1.0 get-childitem


    【解决方案1】:

    你可以试试这个

    dir C:\ProgramData\flx\Output\*\*\*\*\* -filter *.msi 
    

    在这个级别搜索所有.msi文件

    C:\ProgramData\flx\Output\<APP-NAME>\_<TIME_STAMP>\<APP-NAME>\Repackaged or 'MSI Package' or whatever else present folder
    

    没有递归,这样可以避免太深的文件夹给你带来错误。

    将结果传送到:

    Where {$_.LastAccessTime -gt (Get-Date).AddMinutes(-15)} #be sure no action on file is taken before the dir command
    

    或

    Where {$_.LastWriteTime -gt (Get-Date).AddMinutes(-15)} #some file can be re-copied maybe
    

    【讨论】:

    • 使用 Get-ChildItem -Path C:\ProgramData\flx\Output\*\*\*\* -Filter "*.msi" | where {$_.LastAccessTime -gt (Get-Date).AddMinutes(-15)} 有效,但它也会返回我想排除的 MSI。我尝试添加 -Exclude "*.Context.msi" 但这排除了所有内容。
    • @gorideyourbike 我认为您需要将结果通过管道传输到 where-object:| ? { -not $_.basename -match '\.context\.msi$' } | % { ..you logic here }
    • 这是我想出的:Get-ChildItem -Path $outputPath -Filter "*.msi" |where {$_.Name -notlike "*.Context.msi" -and $_.LastAccessTime -gt (Get-Date).AddMinutes(-1440)}。看来你的建议也行。
    • @gorideyourbike 好!将-match 与正则表达式一起使用可能是一种更复杂的过滤方式,但 -notlike 很好!
    【解决方案2】:

    在 C.B. 的帮助下,这是我的新搜索,它消除了我遇到的问题。

    • 将-Path 更改为C:\ProgramData\flx\Output\*\*\*\* 以帮助限制搜索的深度。
    • 使用-Filter 代替-Include 并将-Exclude 逻辑放入where 子句中。

    Get-ChildItem -Path C:\ProgramData\flx\Output\*\*\*\* -Filter "*.msi" | where {$_.Name -notlike "*.Context.msi" -and $_.LastAccessTime -gt (Get-Date).AddMinutes(-15)}

    【讨论】:

      【解决方案3】:

      您不能限制 Get-ChildItem 的递归深度,除非不使用 -Recurse,即 Get-ChildItem 是 depth = 0 或 N。

      为应用名称和时间戳设置变量,例如:

      $appName = "foo" 
      $timestamp = Get-date -Format HHmmss
      Get-ChildItem "C:\ProgramData\flx\Output\${appName}_$timestamp\$appName\MSI Package" -force -r
      

      您可以像这样过滤结果:

      Get-ChildItem <path> -R | Where {$_.LastWriteTime -gt (Get-Date).AddMinutes(-15)}
      

      【讨论】:

      • 我无法设置应用名称或时间戳。这两个项目都由创建文件和文件夹结构的软件控制。
      • 你知道什么是先验值吗?如果不是,您可以使用正则表达式来过滤输出,如gci c:\programdata\fls\output -r -force | Where {!$_.PSIsContainer -and ($_.FullName -match 'Output\\([^_]+)_[^\\]+\\\1\\MSI Package')}
      猜你喜欢
      • 2012-10-26
      • 2011-04-21
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 2011-02-07
      • 1970-01-01
      • 2016-03-02
      相关资源
      最近更新 更多