código de lote não funciona quando colocado dentro de um loop


0

Esse código funciona e escolhe um arquivo aleatório, mas quando o coloco dentro do loop externo, "" "vazio.

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. O que estou tentando fazer é: pastas idênticas de origem e destino com arquivos mp3. Depois, percorro os arquivos de destino e, para cada arquivo de destino, os sobrescrito com um arquivo mp3 aleatório da pasta de origem. Eu (re) movo o arquivo da fonte e escolho aleatoriamente outro arquivo de origem para o próximo arquivo de destino, para esgotar todos os arquivos sem duplicatas. No final, o destino tem os mesmos arquivos e estrutura que a origem, mas agora eles estão embaralhados, ou seja, se eu conseguir alcançá-lo. Eu sei que a matriz leva algum tempo, então também quero otimizá-la.


2
Esses% rand% não deveriam ser! Rand! em vez de? E você pode executá-lo com ECHO ON para ver exatamente quando a mensagem de erro acontece? Sua declaração 'Eu fico vazio ""' em vez disso "não é muito clara sobre onde os loops ocorrem.
Tonny

Eu tentei isso, o resultado agora é apenas randuma string. Ele já está trabalhando com o código acima, imprimindo o nome do arquivo aleatório. Obrigado pela dica ECHO ON. O erro está eco "!file[%rand%]!"aqui. Se você ativar o loop externo rem for /R %%t in (*.mp3) do (, poderá vê-lo. Eu suspeito que a parte EnableDelayedExpansion, devo colocá-lo em outro lugar, eu acho.
vtastek 6/01

Respostas:


0

Existem várias falhas no seu código

  1. com aninhados para loops, você precisará de dois níveis de expansão atrasada (o que é possível)
  2. Para cada iteração externa, for /rvocê recria / substitui a mesma file[]matriz a partir dos arquivos de origem.
  3. se você criar a matriz primeiro, não será necessário alternar constantemente entre a origem e o destino (a pasta é armazenada na matriz de qualquer maneira)
  4. apesar do nome misturador, não está claro o que você deseja alcançar com duas cópias e uma jogada, por favor, elabore.

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

Obrigado pela resposta, vou tentar e ver como vai. O que estou tentando fazer é: pastas idênticas de origem e destino com arquivos mp3. Depois, percorro os arquivos de destino e, para cada arquivo de destino, os sobrescrito com um arquivo mp3 aleatório da pasta de origem. Eu (re) movo o arquivo da fonte e escolho aleatoriamente outro arquivo de origem para o próximo arquivo de destino, para esgotar todos os arquivos sem duplicatas. No final, o destino tem os mesmos arquivos e estrutura que a origem, mas agora eles estão embaralhados, ou seja, se eu conseguir alcançá-lo. Eu sei que a matriz leva algum tempo, então também quero otimizá-la.
vtastek 6/01

Melhor edite sua pergunta para conter essa explicação. O número de arquivos na origem e no destino é idêntico? Você pode usar apenas a matriz, substituir a entrada [aleatória] do arquivo pela última file[n]e diminuir n.
LotPings

Feito. Sim, eles são idênticos. Existem arquivos wav também, mas eles não devem interferir. Mais uma vez obrigado pela dica.
vtastek 6/01

Tente resposta alterada (e não testada), já pode fazer o que você deseja.
LotPings

Muito obrigado. Está funcionando, posso até executar novamente, o que é um bom recurso.
vtastek 6/01
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.