File 如何使用批处理文件随机重新排列文本文件中的行
我正在创建一个随机剥离不同MAC地址的代码,但不知道如何做到这一点。我的想法是用这个脚本随机或重新排列文本文件中MAC地址的顺序,但我不知道如何用批处理文件来实现这一点。其工作原理是,它将读取“maclist.txt”,然后创建一个随机顺序为“maclist_temp.txt”的新临时文件,即重新排列的文件。然后,它将按顺序拉取这个随机文件 我尝试过谷歌和搜索网页,但没有发现任何有用的东西。我仍在积极寻找,但任何建议都会非常有用 像提取和删除随机行,然后添加到底部这样简单的操作可能会奏效。随机化会更好,但我想保留原来的列表。比如:File 如何使用批处理文件随机重新排列文本文件中的行,file,batch-file,text,random,File,Batch File,Text,Random,我正在创建一个随机剥离不同MAC地址的代码,但不知道如何做到这一点。我的想法是用这个脚本随机或重新排列文本文件中MAC地址的顺序,但我不知道如何用批处理文件来实现这一点。其工作原理是,它将读取“maclist.txt”,然后创建一个随机顺序为“maclist_temp.txt”的新临时文件,即重新排列的文件。然后,它将按顺序拉取这个随机文件 我尝试过谷歌和搜索网页,但没有发现任何有用的东西。我仍在积极寻找,但任何建议都会非常有用 像提取和删除随机行,然后添加到底部这样简单的操作可能会奏效。随机化
maclist.txt
。批处理代码的用法如下所示
C:\> type list.txt | shuffle.bat > maclist_temp.txt
以下是shuffle.bat的内容:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET TmpFile=tmp%RANDOM%%RANDOM%.tmp
TYPE NUL >%Tmpfile%
FOR /F "tokens=*" %%i IN ('MORE') DO SET Key=!RANDOM!!RANDOM!!RANDOM!000000000000& ECHO !Key:~0,15!%%i>> %TmpFile%
FOR /F "tokens=*" %%i IN ('TYPE %TmpFile% ^| SORT') DO SET Line=%%i&ECHO.!Line:~15!
::DEL %TmpFile%
ENDLOCAL
发出上述命令后,maclist_temp.txt
将包含随机的MAC地址列表
希望这有帮助。这似乎有效。给它一个要随机化的文件的命令行参数
@echo off
setlocal EnableDelayedExpansion
rem read the number of lines in the file
rem the find prepends the line number so we catch blank lines
for /f "delims=" %%n in ('find /c /v "" %1') do set "len=%%n"
set len=!len:*: =!
rem echo %1 has %len% lines
rem Relocate as many lines as there are lines in the file
for /l %%j in (1 1 !len!) do (
rem echo starting round %%j
rem geta random number between 1 and the number of lines in the file
set /a var=!random! %% !len! + 1
rem echo relocating line !var!
rem make sure there is no temp file
if exist %1.temp del %1.temp
rem read each line of the file, write any that don't match and then write the one that does
<%1 (
for /l %%i in (1 1 !len!) do (
rem if it is the target line then save it
if %%i == !var! (
set /p found=
rem echo saving !found!
)
rem if it is the target line then write it
if not %%i == !var! (
set /p other=
rem echo writing !other!
echo !other!>> %1.temp
)
)
rem now write the target line at the end
rem echo appending !found!
echo !found!>> %1.temp
)
rem replace the original with the temp version
move %1.temp %1>nul
)
rem print the result
type %1
@echo关闭
setlocal EnableDelayedExpansion
rem读取文件中的行数
rem find会在行号前加上前缀,以便捕捉空行
对于/f“delims=“%%n in('find/c/v”“%1'),请设置“len=%%n”
设置len=!蓝:*=!
rem回显%1有%len%行
rem重新定位文件中的行数
对于/l%%j in(11!len!)do(
rem回波开始循环%%j
rem get1和文件中的行数之间的随机数
设置/a变量=!随机!%%!len!+1
rem回声重定位线!var!
rem确保没有临时文件
如果存在%1.temp删除%1.temp
rem读取文件的每一行,写入任何不匹配的行,然后写入匹配的行
>%1.0
)
)
rem现在在末尾写下目标行
rem回声追加!建立
回声!找到!>>%1.1临时
)
rem将原始版本替换为临时版本
移动%1.temp%1>nul
)
rem打印结果
类型%1
这里有一个更简单的方法来随机化文件,不需要临时文件。您甚至可以重用相同的输入文件名
限制是:空行和以开头的行代码>将被跳过,以=
开头的行将删除所有前导的=
符号,并且^
字符将加倍
@echo off
setlocal
for /f "delims=" %%a in (maclist.txt) do call set "$$%%random%%=%%a"
(for /f "tokens=1,* delims==" %%a in ('set $$') do echo(%%b)>newmaclist.txt
endlocal
放入cmd文件
for /f "tokens=2 delims=/" %%m in ('cmd /e:on /v:on /c "for /f %%f in (maclist.txt) do @echo !random!/%%f" ^| sort') do echo %%m
它生成一个cmd,它读取内部for中的mac列表,在mac前面加上一个随机值和斜杠,并对列表进行排序。然后这个列表在输出端被拆分,以便使用斜杠作为分隔符并打印mac地址。我非常喜欢的。尽管如此,我还是希望提供一个解决方案,消除所有列出的限制(尽管仍保留与cmd
相关的限制,如文件大小<2 GiB和行长度<8 KiB)
关键是需要切换哪个,以避免丢失解释标记。这解决了使用特殊字符的所有潜在问题,如^
,&
,%
,代码>,(
,)
,
,
和“
计数器索引
的实现是为了不丢失原始文本文件的一行,这可能在没有索引的情况下发生,因为随机
可能返回重复的值;添加索引
后,生成的变量名$$!random!。index!
是唯一的
findstr/N/R“^”
命令在原始文件的每一行之前都有一个行号,后面跟一个冒号。因此,for/F
循环不会忽略这一点。行号还隐式解决了前导分号的问题,这是for/F
的默认eol
字符
最后,在输出之前,从每一行中删除第一个冒号(记住由findstr
添加的前缀)之前的所有内容,因此不再删除前导的等号
下面是代码:
@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
设置/A“索引=0”
对于/f“delims=“%%a in('findstr/N/R“^”“%~dpn0.lst”)do(
setlocal EnableDelayedExpansion
对于(“$$!random!!index!”)中的/F%%b,请执行以下操作(
端部
设置“%%b=%%a”
)
设置/A“索引+=1”
)
>“%~dpn0.新建”(
对于/f“delims=“%%a in('set$$”)do(
设置“项=%%a”
setlocal EnableDelayedExpansion
回音(!项目::=!
端部
)
)
端部
退出/B
你至少需要有两个临时文件,一个嵌套的for
loopIf在Linux上,这些可能会有帮助:,我不在Linux上,我是Windows 7用户。还有,什么是嵌套的for循环?@computerlife22它指的是loopMine中的循环比shuffle.bat复杂得多-为什么我没有想到这样做呢???有一个更多限制:文字%
符号丢失…不过这是一个很好的方法!也许您对此感兴趣,也可以解决潜在重复随机数的问题。。。