Пакетный код не работает при помещении в цикл

Этот код работает и выбирает случайный файл, но когда я помещаю его во внешний цикл, я получаю пустое "".

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"
)
Другие вопросы по тегам