Arquivos de script em lote do Windows X de um diretório para outro

1

Eu não sou suficiente para escrever qualquer tipo de script em lote, então eu meio que amassei essa solução em outro lugar. Isso faz o trabalho; copia arquivos de um diretório (e todos os seus subdiretórios) para outro diretório, aparentemente aleatoriamente.

No entanto, ele não consegue copiar a quantidade completa de arquivos e não sei por quê. Se eu configurá-lo para 10, ele retornará talvez 7 ou 8. Alguma idéia? Obrigado.

@echo off
setlocal

:: Create numbered list of files in a temporary file
set "tempFile=%temp%\%~nx0_fileList_%time::=.%.txt"
dir "D:\Users\...\Music" /b /s /a-d %1 | findstr /n "^" >"%tempFile%"

:: Count the files
for /f %%N in ('type "%tempFile%" ^| find /c /v ""') do set cnt=%%N

:: Copy number random files, doesn't get them all though?
for /l %%N in (1 1 100) do call :copyRandomFile

:: Delete the temp file
del "%tempFile%"

exit /b

:copyRandomFile
set /a "randomNum=(%random% %% cnt) + 1"
for /f "tokens=1* delims=:" %%A in (
'findstr "^%randomNum%:" "%tempFile%"'
) do xcopy "%%B" "D:\Users\...\Playlists\Random"
exit /b

Edit: Desculpe, para explicar mais: Eu tenho uma pasta cheia de música (embora ordenada em diferentes sub-diretórios baseados em artistas etc) e eu quero selecionar aleatoriamente 100 dos arquivos e copiá-los para a minha pasta de saída, em ordem para essencialmente ter uma playlist aleatória de 100 músicas para transferir para o mp3 player. O código acima faz isso, mas por algum motivo, alguns não copiam a quantidade necessária de arquivos.

    
por EndOnDeath 11.07.2016 / 08:59

1 resposta

0

Precisa ser o lote do Windows? Se não, neste tópico é uma solução do Powershell, bem como algum código de lote.

Powershell:

Get-ChildItem SomeFolder | Get-Random -Count $x | Copy-Item -Destination SomeOtherFolder

Isso pressupõe que você execute o script a partir da pasta em que seus arquivos residem. Substitua SomeFolder por um caminho para seus arquivos e SomeOtherFolder com o destino desejado.

Para explicar um pouco mais:

Get-ChildItem -Path C:\path\to\directory    # Lists content of the directory
                                            # To get subfolders you have to add -Recurse
                                            # to limit this only to files add -Files

Get-Random -Count $x                        # Selects x random items from previous command.
                                            # You have to define $x beforehand

Copy-Item -Destination C:\path\to\destination   # Copies the random selected files to 
                                                # your defined destination

Você pode copiar este código em um arquivo de texto, salvá-lo como * .ps1 e clicar com o botão direito do mouse executar com o powershell .

Eu posso ser possível que o powershell envie um erro como o script não pode ser carregado porque a execução de scripts está desativada neste sistema .

Se esse for o caso, você deve iniciar o PowerShell como administrador e executar Set-ExecutionPolicy RemoteSigned

Nota: Outra desvantagem que encontrei durante o teste é que Get-Random poderia obter o mesmo item mais de uma vez. Prova

Para evitar isso, eu recomendo o comando Get-Unique .

    
por 11.07.2016 / 09:23

Tags