【问题标题】:How do I bulk copy files with brackets in the filename using Powershell如何使用 Powershell 批量复制文件名中带括号的文件
【发布时间】:2012-12-26 11:52:18
【问题描述】:

$基本上我想做的是:

我正在从包含我需要的文件列表的 .csv 电子表格中提取信息。问题是,他们所在的目录包含 16,000 多个文件!我只需要大约 4600 个(因为电子表格列只包含那么多)。我实际上已经弄清楚了代码的所有部分......但是我遇到问题的地方是当它到达我的代码的“复制项”部分时。它运行良好,直到它遇到文件名中包含括号的文件,所以它当然会抛出错误并且没有给我我需要的东西。我怎样才能解决这个问题?请注意,需要/正在复制的文件不能重命名。如果这是一个解决方案,我不确定如何在这里使用“-LiteralPath”。 :( 下面是我的代码:

$Directory = gci D:\Documents\15075_32\
$Destination = "D:\CleanReview"
$ReviewSheet = import-csv 'C:\Users\7cm\Desktop\Internal Review - Emails Removed per Attorney Request.csv'
$BaseItem = foreach($li in $ReviewSheet){$li.Base}
foreach($File in $Directory){
    $File.BaseName
foreach($Item in $BaseItem){
    if($Item -like $File.BaseName){
        $Item
            Copy-Item $File.FullName $Destination -Force
}
}
}

【问题讨论】:

    标签: powershell brackets copying


    【解决方案1】:

    如果您想使用重试文件的能力进行批量复制,我会考虑改用robocopy。如果您仍想使用 Copy-Item,请使用其 -LiteralPath 参数作为源路径。

    【讨论】:

    • 什么意思?像这样: $Directory = gci -LiteralPath D:\Documents\15075_32\
    • 我将 -LiteralPath 放置在目录的路径中,但我不知道这会产生什么影响,因为我稍后会单独声明该目录中的文件。另外,我看到 where -like 支持通配符,即使我让它从字面上看它仍然会抛出通配符错误。所以我将我的运算符切换到 -eq,但现在它告诉我它找不到我的 .MSG 文件,因为路径不存在。所以我将 $Directory 附加到 $File ($Directory+$File) 到 copy-item 行中。但现在即使文件名相同,它也不会复制它们! :(
    • 我能够解决这个问题并获得我想要的结果。我在下面列出了一个解释。
    【解决方案2】:

    好的...在通过 Google 进行大量研究后,我发现即使在 PS V3 中进行了更正,即使使用 -LiteralPath 运算符,它仍在解释副本中带有通配符的文件名。通过我自己的多次尝试,我发现 IF 语句中的操作符导致了这个错误。即使使用 -LiteralPath,它也在 IF 语句中,并且在条件为真时被遗忘。所以为了解决这个问题,然后让它在没有通配符解释的情况下读取文件名,我不得不将我的 -like 切换为 -eq 因为 -eq 不支持通配符。我遇到的下一个问题是 PS 一直报告它在 C 驱动器中查找时找不到文件!即使我已经声明了目录,即使我在复制命令中使用简写声明,它仍然会这样做! PS 似乎对此非常敏感,因此我发现完全按照脚本拼写出来才能达到我需要的结果!因此,回顾一下,我正在使用 csv 并读取其中一列,因为该列是不带扩展名的文件名列表。我将该列表与目录列表进行比较,当名称的列列表与目录中的基本名称匹配时...我需要将这些目录文件复制到 D 驱动器上的另一个文件夹中。这是我的工作代码!感谢 Keith Hill(上图),我开始以不同的方式看待它!感谢您的帮助!

    $Directory = gci -LiteralPath D:\Documents\15075_32\
    $Destination = "D:\CleanReview\"
    $ReviewSheet = import-csv 'C:\Users\7cm\Desktop\Internal Review - Emails Removed per Attorney Request.csv'
    $BaseItem = foreach($li in $ReviewSheet){$li.Base}
    foreach($File in $Directory){
    foreach($Item in $BaseItem){
        if($Item -eq $File.BaseName){
            $Item
                Copy-Item -LiteralPath D:\Documents\15075_32\$File -Destination $Destination -Force
    }
    }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 2010-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-06
      相关资源
      最近更新 更多