从子文件夹复制文件并重命名
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 的新手,所以我认为我的脚本没有经过优化,但它可以工作。
我需要帮助完成一项任务
我需要将导出的文件从子目录复制到新的文件夹位置并重命名。问题是所有导出的文件都具有相同的名称,并且最多可达 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 的新手,所以我认为我的脚本没有经过优化,但它可以工作。