该代码有效并挑选了一个随机文件,但是当我将其放入外循环中时,却得到了空的“”。
rem scrambler
setlocal EnableDelayedExpansion
@echo off
cd j:\target
rem for /R %%t in (*.mp3) do (
REM echo ********************
REM echo T folder is %%~dpt
cd j:\source
set n=0
for /R %%f in (*.mp3) do (
set /A n+=1
set "file[!n!]=%%f"
)
set /A "rand=(n*%random%)/32768+1"
rem copy "!file[%rand%]!" j:\target
echo "!file[%rand%]!"
cd j:\target
REM copy "!file[%rand%]!" %%~dpt
REM move "!file[%rand%]!" j:\old
rem )
PS。我想做的是:源文件夹和目标文件夹都相同,其中包含 mp3 文件。然后我循环遍历目标文件,对于每个目标文件,我用源文件夹中的随机 mp3 文件覆盖它们。我从源文件夹中(重新)移动文件,并为下一个目标文件随机挑选另一个源文件,这样我就用尽了所有文件,没有任何重复。最后,目标具有与源相同的文件和结构,但它们现在被打乱了,如果我能做到的话。我知道数组需要一些时间,所以我也想优化它。
答案1
您的代码中存在几个缺陷
- 对于嵌套的 for 循环,你需要两层延迟扩展(是可能的)
- 对于外部的每次迭代,您都会从源文件
for /r
重建/覆盖相同的数组。file[]
- 如果您首先构建数组,则无需在源和目标之间不断切换(文件夹无论如何都存储在数组中)
- 尽管有名称扰码器,但不清楚您想通过两次复制和一次移动实现什么目的,请详细说明。
:: Q:\Test\2019\01\06\SU_1391138.cmd
rem scrambler
@echo off
setlocal EnableDelayedExpansion
cd j:\source
set n=0
for /R %%f in (*.mp3) do (
set /A n+=1
set "file[!n!]=%%f"
)
cd j:\target
for /R %%t in (*.mp3) do (
set /A "rand=(n*!random!)/32768+1,m=n,n-=1"
rem following line demonstrates double delayedexpansion with a pseudo call
call set "file=%%file[!rand!]%%"
call set "file[!rand!]=%%file[!m!]%%"
echo copy /B /Y "!file!" "%%t"
copy /B /Y "!file!" "%%t"
)