1

$基本上我想做的是:

我正在从包含我需要的文件列表的 .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
}
}
}
4

2 回答 2

1

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

于 2013-01-11T20:54:55.807 回答
0

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