【问题标题】:Robust copy big size files filtered by extension between two drives and preserving each file-path?通过两个驱动器之间的扩展名过滤并保留每个文件路径的强大复制大文件?
【发布时间】:2021-04-19 19:46:57
【问题描述】:

我需要从v:\foo\bar\1\baz.xyz, v:\foo\bar\2\etc.xyz 复制 *.yxz 文件(大约 500 个文件,每个文件 20/30gb 在单独的目录中)到m:\foo\bar\1\baz.xyz, m:\foo\bar\2\etc.xyz...目标目录包含其他文件...

我尝试过使用 powershell,但不幸的是不起作用:

$mylist = Get-ChildItem -Path "v:\" -File -Recurse | Where-Object {( $_.Extension -match ".xyz" )}

$src = $mylist.FullName

$dst = $src | Split-Path
 
$dst = $dst.replace('V:','M:')

foreach ( $line in $src ) { robocopy/copy-item $line $dst }

Robocopy 会更好,但如果不可能,我可以从源获取文件哈希并将其与目标进行比较...

我必须手动复制所有文件?

【问题讨论】:

    标签: powershell robocopy file-copying


    【解决方案1】:

    当您在此循环中使用 $dst 时,您每次都会调用整个目的地数组。相反,您应该将第一个源与第一个目的地一起使用,依此类推。你可以使用这样的东西:

    foreach($line in (0..(($src.length)-1))) { robocopy $src[$line] $dst[$line] }
    

    $line in (0..(($src.length)-1))
    

    这将遍历数组 '$src' 中的每个元素,并将 '$line' 设置为等于索引。

    { robocopy $src[$line] $dst[$line] }    
    

    这通过放置索引来调用数组中的元素。例如'$src[0]' 将返回数组中的第一个元素。

    我无法检查 robocopy 语法,但这应该可以解决循环问题。

    【讨论】:

    • @lanteu,你是绝对正确的 lanteu,现在数组已正确索引,但不幸的是,Robocopy 似乎将每个文件视为一个目录并且复制失败......如果我使用“copy-item”我收到此错误:Cannot bind argument to parameter 'Path' because it is null. 但如果我像这样回显:foreach ( $line in 0..$src.length ) { "$src[$line] $dst[$line]" },shell 会交替打印正确的源文件和目标文件...
    • @Lanteu,这是确切的错误:Copy-Item : Cannot bind argument to parameter 'Path' because it is null. Line:1 char:49 + foreach ( $line in 0..$src.length ) { Copy-Item $src[$line] $dst[$lin ... + ~~~~~~~~~~~ + CategoryInfo : InvalidData: (:) [Copy-Item], ParameterBindingValidationException + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Commands.CopyItemCommand
    • 我的错误。它需要是'foreach($i in (0..(($src.length)-1))){$i}'。它会尝试从这个数组中做一个额外的元素,这个元素不存在,所以会抛出一个错误。将编辑我的帖子。
    • @lanteu,好镜头!真的谢谢兰图!如果我想在这段代码中添加进度条,write-progress cmdlet 是正确的选择吗?
    • 我自己解决了(write.progress)! $i = 0; foreach ($line in (0..(($src.length)-1))) { Copy-Item $src[$line] $dst[$line]; $i++; Write-Progress -activity "Copy in Progress . . ." -status "Copied: $i of $($src.Count)" -percentComplete (($i / $src.Count) * 100) }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    相关资源
    最近更新 更多