PowerShell:遍历目录列表,使用重复处理复制文件

时间:2017-11-21 14:48:55

标签: powershell csv foreach duplicates

编辑:经过一些研究,因为我所做的并没有完全做到这一点,以及之前的建议和评论让我比以前更进一步,我回来了更多的研究和更完整的脚本

Import-CSV C:\saveme\file_path3.csv | ForEach-Object {
Get-ChildItem $_.path -Recurse  | ForEach-Object {
$split = $_.FullName  -split '\\'
$DestFile =  $split[1..($split.Length - 1)] -join '\' 
$DestFile =  "G:\Recuva2\$DestFile"
$null = New-Item -Path $DestFile -Type File -Force
If (Test-Path $DestFile) {
$i = 0
While (Test-Path $DestFile) {
$i += 1
$DestFile = $DestFile+$i
}
} Else {
$null
}
Copy-Item -Path  $_.FullName -Destination $DestFile -Verbose -Force
}
} 

由于无法找到目标目录,这似乎破裂了。它似乎在这条线上打破了

$null = New-Item -Path $DestFile -Type File -Force

和这一行

Copy-Item -Path  $_.FullName -Destination $DestFile -Verbose -Force

这里的共同点似乎是$ DestFile。我知道我对$ DestFile做了很多,但我似乎无法确定导致它破坏的原因。

我想要的最终结果是在我导入的csv列表中复制特定文件时保留文件夹结构。

实际上似乎正在发生的事情是,每当我尝试复制时它都会抛出错误。错误文字如下。

Copy-Item : Could not find a part of the path 'G:\Recuva2\HR_VIOLATORS\REPORTS\REPORT_Storage2\199452\1.3.6.1.4.1.11157.2011.3.21.8.12.5.52516\1.3.51.5156.1369.20110321.1190709\1.3.51.0.7.3750462839.61413.18976.39828.11247.2380.39394'.
At line:16 char:5
+     Copy-Item -Path  $_.FullName -Destination $DestFile -Verbose -Force
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [Copy-Item], DirectoryNotFoundException
+ FullyQualifiedErrorId : System.IO.DirectoryNotFoundException,Microsoft.PowerShell.Commands.CopyItem 
Command

- 结束编辑

ORIGNAL POST:

相似但不完全相同

Keep rename duplicate items with copy

基本上我被迫从csv文件中获取目录列表并复制其内容。但是我遇到的问题是某些目录和文件是重复的。

我正在尝试使用此脚本从csv导入,复制目录结构完整的文件,同时重命名任何重复项,最好是在文件级别,以便合并重复的目录。

Import-CSV C:\COPYME\file_path.csv | foreach($_.path) {
ls $_.path -recurse  | foreach($_) {
$SourceFile = $_.FullName
$DestinationFile = "G:\Recuva2\"+$_
If (Test-Path $DestinationFile) {
    $i = 0
    While (Test-Path $DestinationFile) {
        $i += 1
        $DestinationFile = "G:\Recuva2\"+$_+$i
    }
} Else {
    New-Item -ItemType File -Path $DestinationFile -Force
}
Copy-Item -Path $SourceFile -Destination $DestinationFile -verbose -Force
}
}

我收到一条错误,指出第2行字符24无法解析为方法?我在这里错过了什么/做错了什么?

3 个答案:

答案 0 :(得分:0)

使用PowerShell 4.0+,有一个.foreach() method。但看起来你真的试图使用alias to ForEach-Object,因为iRon在评论中指出不需要($_)

Import-CSV C:\COPYME\file_path.csv | ForEach-Object {
    Get-ChildItem $_.Path -Recurse  | ForEach-Object {
        $SourceFile = $_.FullName
        $DestinationFile = "G:\Recuva2\" + $_
        If (Test-Path $DestinationFile) {
            $i = 0
            While (Test-Path $DestinationFile) {
                $i += 1
                $DestinationFile = "G:\Recuva2\" + $_ + $i
            }
        } Else {
            New-Item -ItemType File -Path $DestinationFile -Force
        }
        Copy-Item -Path $SourceFile -Destination $DestinationFile -Verbose -Force
    }
}

答案 1 :(得分:0)

ForEach-Object cmdletForEach loop之间存在差异。

Import-Csv -Path 'C:\COPYME\file_path.csv' |
    ForEach-Object {
        ls $_.path -recurse  |
            ForEach-Object {
                $SourceFile = $_.FullName
                $DestinationFile = "G:\Recuva2\"+$_
                If (Test-Path $DestinationFile) {
                    $i = 0
                    While (Test-Path $DestinationFile) {
                        $i += 1
                        $DestinationFile = "G:\Recuva2\"+$_+$i
                    }
                } Else {
                    New-Item -ItemType File -Path $DestinationFile -Force
                }
                Copy-Item -Path $SourceFile -Destination $DestinationFile -verbose -Force
    }
}

答案 2 :(得分:0)

事实证明,我试图传递我已经获得的数据,从而导致了我自己的问题。脚本的工作版本如下。对于我迄今为止所经历过的大大小小的测试,这都完美无缺。感谢上面的答案,以帮助我了解和理解powershell。

Import-CSV C:\COPYME\file_path.csv | ForEach-Object {
Get-ChildItem $_.path -recurse | ForEach {
$split = $_.FullName  -split '\\'
$DestinationFile = $split[1..($split.Length - 1)] -join '\'
$DestinationFile = "D:\HUBICOPY\$DestinationFile"
#$DestinationFile = (Resolve-Path $DestinationFile).Path
#$null = New-Item -Path $DestinationFile -Type File -Force
If (Test-Path $DestinationFile)
{
$i = 0
While (Test-Path $DestinationFile)
{
$i += 1
$DestinationFile = $DestinationFile+$i
}
}
Else {New-Item -ItemType File -Path $DestinationFile -Force}
Copy-Item -Path $_ -Destination $DestinationFile -verbose -Force
}
}