Как заставить этот цикл выполнять только для 1 из каждых 100 файлов? - PullRequest
0 голосов
/ 21 октября 2018

Мне нужно, чтобы цикл for выполнялся для 1 в ~ каждые 100 файлов ...

for /f "delims=" %%v in ('dir /s /b /a-d 2^>nul') do if "%time:~9,2%"=="77" echo process "%%v"

Проблема в том, что один и тот же номер назначен для всех файлов, поэтому весь набор файлов пропускается.с вероятностью ~ 1: 100 обработки всех файлов.

Ответы [ 2 ]

0 голосов
/ 21 октября 2018

Просто несколько идей.

@echo off
    setlocal enableextensions disabledelayedexpansion

    echo(
    echo Case 1, one file each 100
    echo(

    rem Initialize counter variable. 
    rem Here two options, fixed start or random start
    set "n=0"
    set /a "n= %random% %% 100"

    rem While hidding stderr
        rem For each file
            rem Increase the counter and calculate 1 / n mod 100
            rem Calc will fail if n is a multiple of 100
            rem Use conditional execution operator to detect failure and 
            rem echo the file name

    2>nul (
        for /f "delims=" %%a in ('dir /s /b /a-d') do (
            set /a "n+=1", "1/(n %% 100)" || echo %%a
        )
    )

    echo(
    echo Case 2, random file selection with a 1/100 probability
    echo( 

    setlocal enabledelayedexpansion
    2>nul (
        for /f "delims=" %%a in ('dir /s /b /a-d') do (
            set /a  "1/(!random! * 100 / 32768)" || (
                setlocal disabledelayedexpansion
                echo %%a
                endlocal
            )
        )
    )
    endlocal 

    echo(
    echo Case 3, random 1/100 file selection 
    echo(

    rem Generate a list of files with a random prefix, sort the list and then 
    rem retrieve one file each 100 with the same method in case 1

    set "n=0"
    2>nul (
        for /f "tokens=1,*" %%a in ('
            dir /s /b /a-d 
            ^| cmd /q /e /v /c"for /f delims^= %%a in ('find /v ""') do set /a !random! & echo  %%a"
            ^| sort
        ') do (
            set /a "n+=1", "1/(n %% 100)" || echo %%b
        )
    )
0 голосов
/ 21 октября 2018
@echo off
setlocal enabledelayedexpansion
for %%a in (*) do (
  set /a rnd=!random! %% 100
  rem echo !rnd!
  if !rnd! == 0 ECHO process "%%~fa" 
)

rnd создается для хранения числа от 0 до 99. Таким образом, if срабатывает с вероятностью 1% на файл (используйте if !rnd! lss 25 ... для вероятности 25%).
Это дает вам 1% ваших файлов в среднем .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...