4

Я пытаюсь выбрать случайные 100 песен для копирования на мой mp3-плеер, чтобы у меня было что-то новое для прослушивания каждое утро без необходимости перетаскивать случайные файлы самостоятельно (я не могу сразу поместить всю свою библиотеку в плеер),

Я использую сценарий летучей мыши, чтобы сделать это, но я столкнулся с несколькими препятствиями. Тот, что у меня ниже, работает, но копирует ВСЕ файлы в случайную папку, а не случайный файл из случайной папки, прежде чем перейти к следующей.

Я полный новичок с этим, так что все как бы выбрано из других решений здесь и объединено.

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

Я также попытался добавить цикл for для подсчета от 1 до 100, но никак не могу обойти его. Есть ли кто-нибудь, кто может спасти этого идиота?

Я попытался спросить об этом по вине Сервера и мне сказали, что это будет лучшее место, чтобы спросить.

2 ответа2

1

Попробуйте это (установите имена папок и количество файлов для копирования):

@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
1

Вот решение 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")

Сохраните это как текстовый файл на жестком диске где-нибудь с расширением .ps1 . Затем создайте ссылку на ярлык на рабочем столе, указав путь

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

Это удалит все , что в папке $destFolder и скопировать $filesToCopy файлы от $sourceFolder и вложенных папок с помощью $searchFilter в качестве фильтра

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