我有以下案例:
我有两个文件夹,其中有多个文件,它们具有匹配的名称和不同的扩展名,例如:
\source\A\345.jpg \source\B\345.dat
我想做两个操作:
从两个文件夹中选择一组随机文件并复制到另一个文件夹。下面的代码仅适用于 1 组,我目前的障碍是为两个文件夹/扩展名类型使用相同的随机数,这样我才能得到一组匹配的
.jpg
文件.dat
。将选定的文件重命名为唯一文件数范围内的随机数(
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