【问题标题】:Powershell - excluding folders from stringPowershell - 从字符串中排除文件夹
【发布时间】:2017-07-31 16:34:35
【问题描述】:

我有一个巨大的目录(几千个文件夹),如下所示:

...\94000\abc\def\hig
...\95000\abc\def\hig 
...\96000\abc\def\hig
...\97000\abc\def\hig
...

因此,路径的一部分是交替的,但文件夹结构的其余部分是相同的。 abc和def下还有很多子文件夹等。

我需要做的是从假设文件夹“hig”中复制一个特定文件。

我对 Powershell 还很陌生,但设法整理了以下内容:

$destination = "C:\Users\etc..."
   $source = "B:\94000"
   Get-ChildItem $source -Filter "LIVE*.docx" -File -Recurse | Foreach {
          Copy-Item $_.FullName $destination
   }

我知道这是非常基本的,但它确实有效。问题是它很慢,请给出要筛选的文件夹数量。

有什么办法可以加快进度吗?我正在考虑让脚本跳过我知道不包含我需要的文件的文件夹。

我还想知道是否可以在路径中使用通配符,这样我就可以定义确切的文件夹,如下所示: \9*000abc\def\hig

但两者都无法正常工作。

非常感谢任何想法!

【问题讨论】:

    标签: powershell


    【解决方案1】:

    您绝对可以像您暗示的那样使用通配符。你可以这样做:

    Get-ChildItem B:\9*000\abc\def\hig\live*.docx
    

    那应该返回如下文件:

    B:\94000\abc\def\hig\livesite.docx
    B:\94000\abc\def\hig\live.docx
    B:\95000\abc\def\hig\livefreeordie.docx
    B:\96000\abc\def\hig\liverandonions.docx
    B:\96000\abc\def\hig\livesinmomsbasement.docx

    然后您可以将它们通过管道传递给Copy-Item -Destination $destination,例如:

    Get-ChildItem B:\9*000\abc\def\hig\live*.docx | Copy-Item -Destination $destination
    

    【讨论】:

      【解决方案2】:

      使用Get-ChildItem,您可以使用带有字符串的-Exclude 来跳过使用的文件夹/文件。这可能会加快速度。此外,如果您使用的是 Powershell 2.0,Get-ChildItem 会非常慢。升级到 Powershell 3.0 或更高版本会更快。

      【讨论】:

        【解决方案3】:

        默认支持路径中的通配符。同样,您的过滤器是解析文件的最快方法(相对于 Where-Object 之类的东西)。您的ForEach-Object 电话实际上可能会减慢速度。另一个答案在加快这方面的速度是正确的,因为它可以在不添加另一个迭代步骤的情况下接受管道输入。

        $destination = 'C:\Users\etc\'
        $source = 'B:\94*00'
        Get-ChildItem -Path $source -Filter "LIVE*.docx" -File -Recurse |
          Copy-Item -Destination $destination
        

        【讨论】:

          猜你喜欢
          • 2022-01-12
          • 1970-01-01
          • 2013-10-10
          • 2021-09-13
          • 1970-01-01
          • 2017-12-18
          • 2020-09-08
          • 2013-05-03
          • 2015-05-18
          相关资源
          最近更新 更多