Copie o arquivo aleatório da subpasta aleatória para a pasta de destino usando um script de batida do windows

4

Estou tentando escolher aleatoriamente 100 músicas para copiar para meu mp3 player, para que eu tenha algo novo para ouvir todas as manhãs sem precisar arrastar e soltar arquivos aleatórios (não consigo colocar toda a minha biblioteca no player de uma vez só).

Estou usando um script de morcego para fazer isso, mas encontrei alguns obstáculos. O que eu tenho abaixo funciona, mas copia todos os arquivos em uma pasta aleatória em vez de um arquivo aleatório de uma pasta aleatória antes de passar para a próxima.

Sou um novato completo com isso, então tudo é meio que extraído de outras soluções aqui e agrupadas.

echo off
:randomstart
setlocal EnableDelayedExpansion
rem Enter into the directory that contain the folders
pushd D:\test1\
rem Create an array with all folders
set i=0
for /D %%a in (*) do (
   set /A i+=1
   set folder[!i!]=%%a
)
rem Randomly select one folder
set /A index=(%random%*i)/32768 + 1
rem Copy the desired file
copy "!folder[%index%]!\" "D:\output2\" /Y
rem And return to original directory
popd
ping -n 2 localhost >nul
goto:randomstart

Eu também tentei adicionar um loop for para contar de 1 a 100, mas não consigo pensar nisso nem um pouco. Existe alguém aí que possa salvar esse idiota?

Eu tentei perguntar isso na falha do servidor e foi dito que seria um lugar melhor para perguntar.

    
por R. Bean 24.04.2013 / 22:37

2 respostas

1

Tente isso (defina os nomes das pastas e o número de arquivos para copiar):

@echo off&setlocal enabledelayedexpansion
set "musicroot=test"
set "playfolder=output"
set /a filecount=20

pushd "%musicroot%"
for /r %%i in (*.mp3) do set /a files+=1& set "$!files!=%%~i"
popd
pushd "%playfolder%"
:randomloop
set /a rd=%random%%%files+1
set "mp3=!$%rd%!"
if not defined mp3 goto :randomloop
set "$%rd%="
for %%i in ("%mp3%") do if exist "%%~nxi" echo "%%~nxi" already exist in %playfolder%.& goto:randomloop
copy "%mp3%"
set /a filecount-=1
if %filecount% gtr 0 goto:randomloop
popd
    
por 24.04.2013 / 23:35
1

Aqui está uma solução de powershell

#edit this for your settings
$sourceFolder = 'E:\test'
$destFolder = 'E:\Test2'
$filesToCopy = 100
$searchFilter = '*.mp3'



function Copy-RandomFiles
{
param (
    [Parameter(Mandatory=$true, Position=0)]
    [string]$SourceDirectory,

    [Parameter(Mandatory=$true, Position=1)]
    [string]$DestinationDirectory,

    [int]$FilesToCopy = 100,

    [string]$SearchFilter = '*.*'
    )

    $rand = New-Object System.Random

    $files = [System.IO.Directory]::GetFiles($SourceDirectory, $SearchFilter, [System.IO.SearchOption]::AllDirectories)

    $usedIndexes = @{}
    $filteredList = New-Object System.Collections.ArrayList

    #build list of random indexes
    for([int]$i = 0; ($i -lt $FilesToCopy) -and ($i -lt $files.Length); $i++)
    {
        $index = $rand.Next(0, $files.Length)
        #loop till we find an available index
        while($usedIndexes.ContainsKey($index))
        {
            $index = $rand.Next(0, $files.Length)
        }

        $usedIndexes.Add($index, $null)
        $dump = $filteredList.Add($files[$index]) #dump is so it does not display a count
    }

    if($filteredList.Count -gt 0)
    {
        Copy-Item -Path $filteredList.ToArray() -Destination $DestinationDirectory
    }

    $count = $filteredList.Count

    Write-Host "$count file(s) copied"
}

Get-ChildItem $destFolder | Remove-Item
Copy-RandomFiles $sourceFolder $destFolder -FilesToCopy $filesToCopy -SearchFilter $searchFilter

Write-Host "Press any key to continue . . ."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

Salve como um arquivo de texto no disco rígido em algum lugar com a extensão .ps1 . Em seguida, crie um link de atalho na sua área de trabalho com isso como o caminho

%windir%\system32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Unrestricted -file C:\Path\To\CopyFileScript.ps1

Isso excluirá tudo na pasta $destFolder e copiará $filesToCopy arquivos de $sourceFolder e suas subpastas usando $searchFilter como filtro

    
por 25.04.2013 / 00:25

Tags