Пакетный код не работает при помещении в цикл
Этот код работает и выбирает случайный файл, но когда я помещаю его во внешний цикл, я получаю пустое "".
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"
)