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

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

0

В вашем коде есть несколько недостатков

  1. с вложенным для петель вам нужны два уровня замедленного расширения (что возможно)
  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"
)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .