Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File 如何使用批处理文件随机重新排列文本文件中的行_File_Batch File_Text_Random - Fatal编程技术网

File 如何使用批处理文件随机重新排列文本文件中的行

File 如何使用批处理文件随机重新排列文本文件中的行,file,batch-file,text,random,File,Batch File,Text,Random,我正在创建一个随机剥离不同MAC地址的代码,但不知道如何做到这一点。我的想法是用这个脚本随机或重新排列文本文件中MAC地址的顺序,但我不知道如何用批处理文件来实现这一点。其工作原理是,它将读取“maclist.txt”,然后创建一个随机顺序为“maclist_temp.txt”的新临时文件,即重新排列的文件。然后,它将按顺序拉取这个随机文件 我尝试过谷歌和搜索网页,但没有发现任何有用的东西。我仍在积极寻找,但任何建议都会非常有用 像提取和删除随机行,然后添加到底部这样简单的操作可能会奏效。随机化

我正在创建一个随机剥离不同MAC地址的代码,但不知道如何做到这一点。我的想法是用这个脚本随机或重新排列文本文件中MAC地址的顺序,但我不知道如何用批处理文件来实现这一点。其工作原理是,它将读取“maclist.txt”,然后创建一个随机顺序为“maclist_temp.txt”的新临时文件,即重新排列的文件。然后,它将按顺序拉取这个随机文件

我尝试过谷歌和搜索网页,但没有发现任何有用的东西。我仍在积极寻找,但任何建议都会非常有用

像提取和删除随机行,然后添加到底部这样简单的操作可能会奏效。随机化会更好,但我想保留原来的列表。比如:

  • 制作一个名为maclist_temp.txt的maclist.txt临时副本
  • 取一个随机MAC地址,将其从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复杂得多-为什么我没有想到这样做呢???有一个更多限制:文字
    %
    符号丢失…不过这是一个很好的方法!也许您对此感兴趣,也可以解决潜在重复
    随机数的问题。。。