如何批量重命名两个文件夹中具有不同扩展名的多个文件

如何批量重命名两个文件夹中具有不同扩展名的多个文件

我有以下案例:

  • 我有两个文件夹,其中有多个文件,它们具有匹配的名称和不同的扩展名,例如:

      \source\A\345.jpg
      \source\B\345.dat
    

我想做两个操作:

  1. 从两个文件夹中选择一组随机文件并复制到另一个文件夹。下面的代码仅适用于 1 组,我目前的障碍是为两个文件夹/扩展名类型使用相同的随机数,这样我才能得到一组匹配的.jpg文件.dat

  2. 将选定的文件重命名为唯一文件数范围内的随机数(selectcount在下面的代码中,名称范围为 1-20)。但我想将两个扩展名都重命名为匹配的名称。所以我最终会得到:

      345.jpg ->5.jpg
      345.dat ->5.dat
    

代码:

$SelectCount = 20

$SourcePath1  = "C:\ProjectA\source\A\*.jpg"
$SourcePath2  = "C:\ProjectA\source\B\*.dat"

$DestPath    = 'C:\ProjectA\Renamed'

If (!(test-path $DestPath)) {md $DestPath | out-null} 

$files1 = Get-ChildItem -path $SourcePath -file -recurse | Get-Random -count $SelectCount
$files2 = Get-ChildItem -path $SourcePath -file -recurse | Get-Random -count $SelectCount

for ($i = 0; $i -lt $files1.count; $i += 2) {
   copy-item $files1[$i] -destination ('{0}' -f $DestPath, ($i/2+100))
   copy-item $files1[$i+1] -destination ('{0}' -f $DestPath, ($i/2+100))
   copy-item $files2[$i] -destination ('{0}' -f $DestPath, ($i/2+100))
   copy-item $files2[$i+1] -destination ('{0}' -f $DestPath, ($i/2+100))
}

答案1

因为您想从两个不同的文件夹中随机选择文件,并且希望确保根据它们的 BaseName(不带扩展名的 .Name 属性)拥有相同数量的匹配文件,所以我会这样做:

$SelectCount  = 20

$SourcePath1  = "C:\ProjectA\source\A"
$SourcePath2  = "C:\ProjectA\source\B"
$DestPath     = 'C:\ProjectA\Renamed'

# creates a new folder only if this did not already exist
$null = New-Item -Path $DestPath -ItemType Directory -Force

do {
    # get $SelectCount jpg files (in a loop to make sure you end up with 20 unique files)
    do {
        $jpgFiles = Get-ChildItem -Path $SourcePath1 -Filter '*.jpg' -File -Recurse | 
                    Get-Random -Count $SelectCount | Sort-Object BaseName -Unique
    } until ($jpgFiles.Count -eq $SelectCount)

    # try to find as many .dat files with similar basenames
    $datFiles = Get-ChildItem -Path $SourcePath2 -Filter '*.dat' -File -Recurse |
                Where-Object { $jpgFiles.BaseName -contains $_.BaseName } | Sort-Object BaseName -Unique
} until ($datFiles.Count -eq $SelectCount)

# if you want to go really, REALLY random, shuffle the $jpgFiles array here
# $jpgFiles = $jpgFiles | Sort-Object { Get-Random }

# copy and rename the matching items
for ($i = 0; $i -lt $SelectCount; $i++) {
    # copy the jpg with new name to the destination
    $jpgFiles[$i] | Copy-Item -Destination (Join-Path -Path $DestPath -ChildPath "$($i + 1).jpg")
    # find the matching .dat file and copy that too, using the same BaseName
    $datFiles | Where-Object {$_.BaseName -eq $jpgFiles[$i].BaseName } | 
                Copy-Item -Destination (Join-Path -Path $DestPath -ChildPath "$($i + 1).dat")
}

答案2

我不完全明白你想如何重命名文件 - 但我认为你想给它们起一个从 1 到指定的$SelectCount

基本上,您可以将所有文件放在一个文件中,然后通过检查它们的 basename 属性Get-ChildItem将它们配对在一起。Group-Object

您可以在for块中执行重命名。

$SourcePathJpg  = "C:\ProjectA\source\A"
$SourcePathDat  = "C:\ProjectA\source\B"
$DestPath       = "C:\ProjectA\Renamed"
$SelectCount    = 20

New-Item $DestPath -ItemType Directory -ErrorAction SilentlyContinue > $null

# Get Items of both folders, group them via basename property, and get randoms
$RandomItems = Get-ChildItem -Path $SourcePathJpg, $SourcePathDat -Recurse | 
               Where-Object { $_.Extension -in '.dat','.jpg' } | 
               Group-Object BaseName | Where-Object Count -eq 2 |
               Get-Random -Count $SelectCount

# Rename the stuff, remove -PassThru if you don't want a return
for ($i = 0; $i -lt $SelectCount; $i++) {
    $RandomItems[$i].Group | Copy-Item -Destination { 
        Join-Path $DestPath ([string]($i + 1) + $_.Extension) 
    } -PassThru
}

输出(-PassThru如果不需要输出请删除):

    Verzeichnis: C:\ProjectA\Renamed


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       01.02.2022     09:44              0 1.jpg
-a----       01.02.2022     09:44              0 1.dat
-a----       01.02.2022     09:44              0 2.jpg
-a----       01.02.2022     09:44              0 2.dat
-a----       01.02.2022     09:44              0 3.jpg
-a----       01.02.2022     09:44              0 3.dat
-a----       01.02.2022     09:44              0 4.jpg
-a----       01.02.2022     09:44              0 4.dat
-a----       01.02.2022     09:44              0 5.jpg
-a----       01.02.2022     09:44              0 5.dat
-a----       01.02.2022     09:44              0 6.jpg
-a----       01.02.2022     09:44              0 6.dat
-a----       01.02.2022     09:44              0 7.jpg
-a----       01.02.2022     09:44              0 7.dat
-a----       01.02.2022     09:44              0 8.jpg
-a----       01.02.2022     09:44              0 8.dat
-a----       01.02.2022     09:44              0 9.jpg
-a----       01.02.2022     09:44              0 9.dat
-a----       01.02.2022     09:44              0 10.jpg
-a----       01.02.2022     09:44              0 10.dat
-a----       01.02.2022     09:44              0 11.jpg
-a----       01.02.2022     09:44              0 11.dat
-a----       01.02.2022     09:44              0 12.jpg
-a----       01.02.2022     09:44              0 12.dat
-a----       01.02.2022     09:44              0 13.jpg
-a----       01.02.2022     09:44              0 13.dat
-a----       01.02.2022     09:44              0 14.jpg
-a----       01.02.2022     09:44              0 14.dat
-a----       01.02.2022     09:44              0 15.jpg
-a----       01.02.2022     09:44              0 15.dat
-a----       01.02.2022     09:44              0 16.jpg
-a----       01.02.2022     09:44              0 16.dat
-a----       01.02.2022     09:44              0 17.jpg
-a----       01.02.2022     09:44              0 17.dat
-a----       01.02.2022     09:44              0 18.jpg
-a----       01.02.2022     09:44              0 18.dat
-a----       01.02.2022     09:44              0 19.jpg
-a----       01.02.2022     09:44              0 19.dat
-a----       01.02.2022     09:44              0 20.jpg
-a----       01.02.2022     09:44              0 20.dat

相关内容