从列表中随机替换文件(批处理文件)

从列表中随机替换文件(批处理文件)

我需要帮助创建一个批处理文件。问题的关键是我需要随机选择一个文件(从 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

3.如果0是已排序的,则不设置变量skip,不会干扰,从而获取第一个项目,不会跳过任何行。

4.无论行数是否为 (0或其他最多为maximum的值-1),使用行/文件%%~i都会立即退出循环。


删除随机获得的行 a 的选项......

@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

相关内容