Necesito ayuda para crear un archivo por lotes. El quid del problema es que necesito seleccionar aleatoriamente un archivo (de la cantidad de N archivos) y moverlo a otro directorio (reemplazando el archivo anterior)
Intenté usar este código aquí:
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
)
Respuesta1
@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
Este es el caso para obtener la ruta de su archivo a copiar, usando un sorteo aleatorio en el rango 1 y el número total de líneas en su archivo de texto.
1.Utilice el rango -/+número total de líneas -1:100 lines == range [-100-1] - [+100-1]
2.Utilice este valor para skip=?
las líneas anteriores, configure skip= resulting number
y utilícelo en For /f
el bucle.
3.Si 0
es el ordenado, la variable to skip
no se establece y no interfiere, haciendo que el primer elemento que se obtenga no se salte ninguna línea.
4.Independientemente de si las líneas son ( 0
u otro valor hasta a maximum
of -1
), use la línea/archivo %%~i
para salir inmediatamente del bucle.
Una opción para eliminar la fila obtenida al azar...
@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