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

copying files from subfolders and renaming

我需要帮助完成一项任务

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

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

我尝试了以下 link,效果很好,但数据会到处都是。例如,在名为 SCAN13.TIF 的新文件夹位置中复制并重命名的文件实际上是子目录 Export24

中的文档

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

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

是否可以通过脚本实现,或者是否有相应的工具?

感谢您的宝贵时间

如果我对您的理解正确,则以下内容应该有效:

$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 变量。源是您要从中复制的文件夹的根目录。

最终结果将是源目录中的任何 .TIF 文件被复制到目标文件夹,文件名为 Scan[$i].TIF,其中每个复制的文件的数字重复 1。

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

## Q:\Test18\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

如果输出看起来正常 remove/comment 尾部 -WhatIf 参数。

我的 ramdisk 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

你可以先试试这个

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

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

这不是您正在寻找的全部答案,但希望是您需要的一部分。

我在这里分享这个脚本,希望它对其他人有用。我个人会很高兴早点在这里找到它。

## 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 的新手,所以我认为我的脚本没有经过优化,但它可以工作。