목록에서 파일을 무작위로 교체(배치 파일)

목록에서 파일을 무작위로 교체(배치 파일)

배치 파일을 만드는 데 도움이 필요합니다. 문제의 핵심은 파일을 무작위로 선택하고(N개의 파일 수에서) 이를 다른 디렉터리로 이동해야 한다는 것입니다(이전 파일 교체).

여기서 이 코드를 사용하려고 했습니다.

for /f "usebackq delims=" %%i in ("example.txt") do (
 call set $%%random%%=%%i
 )
for /f "delims==" %%i in ('set $') do (
 replace D:\test\Z\TEST /R
 exit /b
 )

답변1

@echo off

setlocal & set "_dir=%Temp%\Test\Target\."

for /f %%f in ('type example.txt^|find/v /c ""')do set /a "_max=%%~f-1"
set /a "_line=%random% * (-%_max% - %_max% + 1) / 32768 + %_max%"

if %_line% neq 0 set "_skip=skip^=%_line:-=%"

for /f %_skip%^usebackq^ ^tokens^=*^ ^delims^= %%i in (
    "example.txt")do move/y "%%~i" "%_dir%" & endlocal & exit /b

범위 1의 무작위 그리기와 텍스트 파일의 총 줄 수를 사용하여 복사할 파일의 경로를 얻는 경우입니다.

1.-/+총 줄 수 -1 범위를 사용합니다.100 lines == range [-100-1] - [+100-1]

2.이 값을 skip=?이전 라인에 사용하여 을 설정 skip= resulting number하고 루프에서 사용하십시오 For /f.

삼.가 정렬된 경우 0변수가 skip설정되지 않고 간섭하지 않아 첫 번째 항목을 얻으며 줄을 건너뛰지 않습니다.

4.라인이 ( 0또는 최대 a까지의 다른 값 maximum) 인지 여부에 관계없이 -1라인/파일을 사용하면 %%~i루프가 즉시 종료됩니다.


무작위로 얻은 행을 제거하는 옵션...

@echo off

setlocal & set "_dir=%Temp%\Test\Target\."
for /f %%f in ('type ".\example.txt" ^| find/v /c ""
')do if %%~f geq 1 (set /a "_max=%%~f-1")else goto :eof

set /a "_line=%random% * (-%_max% - %_max% + 1) / 32768 + %_max%"
 
if %_line% neq 0 set "_skip=skip^=%_line:-=%"
for /f %_skip%^usebackq^ ^tokens^=*^ ^delims^= %%i in (
     "example.txt")do set "_file=%%~i" && goto %:^)
    
%:^)
findstr /v /c:"%_file%" <".\example.txt" >"%temp%\example.txt"
move /y "%_file%" "%_dir%" && move/y "%temp%\example.txt" ".\example.txt"
endlocal & goto :eof

관련 정보