批处理代码在循环内不起作用

批处理代码在循环内不起作用

该代码有效并挑选了一个随机文件,但是当我将其放入外循环中时,却得到了空的“”。

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

您的代码中存在几个缺陷

  1. 对于嵌套的 for 循环,你需要两层延迟扩展(可能的)
  2. 对于外部的每次迭代,您都会从源文件for /r重建/覆盖相同的数组。file[]
  3. 如果您首先构建数组,则无需在源和目标之间不断切换(文件夹无论如何都存储在数组中)
  4. 尽管有名称扰码器,但不清楚您想通过两次复制和一次移动实现什么目的,请详细说明。

:: 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"
)

相关内容