从子文件夹复制文件并重命名

时间:2018-12-06 23:34:52

标签: powershell batch-file cmd batch-rename

我需要任务方面的帮助

我需要将导出的文件从子目录复制到新的文件夹位置,并重命名它们。问题是所有导出的文件都具有相同的名称,最多可以有500个

--Old Folder
 ---Export1
    ---Scan.TIF
 ---Export2
    ---Scan.TIF
 ---Export3
    ---Scan.TIF

我尝试了以下链接,该链接工作正常,但数据无处不在。例如,在名为SCAN13.TIF的新文件夹位置中复制并重命名的文件实际上将是子目录Export24中的文档

https://sumtips.com/snippets/powershell/copy-files-rename-duplicates-subfolder/

我需要一个脚本帮助,该脚本可以将文件从所有子目录复制到新位置,并重命名并匹配数据

是可以通过脚本编写还是可以使用的工具?

感谢您的时间

4 个答案:

答案 0 :(得分:1)

此脚本使用正则表达式获取scan.tif文件目录名称的结尾编号。
-match运算符将RegEx捕获组()存储在$ Matches集合中,该集合用于通过-f(ormat)运算符构建目标名称。

## Q:\Test\2018\12\07\SO_53661264.ps1
$Src = "A:\Old Folder"
$Dst = "A:\New Folder"

Set-Location $Src
Get-ChildItem Scan.tif -Recurse -File |
  Where {$_.Directory.Name -match 'Export(\d+)$'} |
    Copy-Item -Destination {Join-Path $Dst ("Scan{0}.TIF" -f $Matches[1])} -WhatIf

如果输出看起来正常,请删除/注释尾随-WhatIf参数。

运行脚本后,我的虚拟磁盘示例tree /f

> tree /F \
Auflistung der Ordnerpfade für Volume RamDisk
├───New Folder
│       Scan1.TIF
│       Scan2.TIF
│       Scan3.TIF
│
└───Old Folder
    ├───Export1
    │       Scan.TIF
    │
    ├───Export2
    │       Scan.TIF
    │
    └───Export3
            Scan.TIF

答案 1 :(得分:0)

如果我对您的理解正确,那么以下方法应该起作用:

data.frame

您将需要更改df <- read.table(text = "V1 V2 V3 V4 V5 V6 A B C D E F", header = T, colClasses = "character") $source = "C:\test" $Destination = "C:\Users\user\Documents\Tests" $i = 1 foreach ($file in (Get-ChildItem -Recurse $source -Filter *.TIF)) { Copy-Item $file.FullName -Destination "$destination\Scan$i.TIF" $i++ } 变量。源是要复制的文件夹的根目录。

最终结果是将源目录中的任何$source文件向下复制到文件名为$destination的目标文件夹中,其中每个复制的文件上的数字以1进行迭代。

答案 2 :(得分:0)

您可以先尝试一下

将文件夹名称放在文件名的开头

Get-ChildItem <Directory of File> -Filter *.ext -Recurse | Rename-Item -NewName {$_.Directory.Name+'_'+$_.Name}

这不是您要寻找的全部答案,而是希望您能找到所需的一部分。

答案 3 :(得分:0)

我在这里共享此脚本,希望对其他人有用。我个人很乐意早点在这里找到它。

## Extract and rename.ps1
$src = split-path -parent $MyInvocation.MyCommand.Definition;
$root = split-path -parent $src;
$folderName = (get-item $src ).Name;
$suffix = '-extract';
$newFolderPath = "$($root)\$($folderName)$($suffix)\";
Write-Host "Extracting files from $($folderName) to $($folderName)$($suffix)";
New-Item -ItemType directory -Force -Path $newFolderPath
Set-Location $src
Get-ChildItem -Recurse -File -Exclude *.ps1 |
    ForEach-Object {
        $currentFolderName = Split-Path -Path $_.Directory.FullName -Leaf;
        $currentFileName = Split-Path -Path $_.FullName -Leaf;
        $newFileName = "$($currentFolderName)_$($currentFileName)";
        [System.IO.Path]::GetInvalidFileNameChars() |
            ForEach-Object {
                $newFileName = $newFileName.replace($_,'.');
            }
        $destination = Join-Path $newFolderPath $newFileName;
        Copy-Item -literalpath $_ -Destination $destination -Force;
        Write-Host $_ => $destination;
    }

结果:

├───Old Folder-extract         <========== The resulting folder
│       Export1_Scan.TIF
│       Export2_Scan.TIF
|       Sub Export 2.2_Scan.TIFF
│       Export3.TIF
│
└───Old Folder                 <========== The chaotic folder
    │   Extract and rename.ps1 <========== The script must be placed here
    │
    ├───Export1
    │       Scan.TIF
    │
    ├───Export2
    │   │   Scan.TIFF
    │   └───Sub Export 2.2
    │          Scan.TIF
    │       
    └───Export3
            Scan.TIF

我是Powershell的新手,所以我认为我的脚本没有经过优化,但是可以使用。