3

我正在创建一个随机删除不同 MAC 地址的代码,但无法弄清楚如何执行此操作。我对如何解决此问题的想法是使用此脚本随机化或重新排列文本文件中 MAC 地址的顺序,但我无法弄清楚如何使用批处理文件执行此操作。它的工作原理是它将读取“maclist.txt”,然后使用随机顺序“maclist_temp.txt”创建一个新的临时文件,这将是重新排列的文件。然后,它将按顺序拉取这个随机文件。

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

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

  1. 制作名为 maclist_temp.txt 的 maclist.txt 的临时副本
  2. 取一个随机 MAC 地址,从 maclist_temp.txt 中删除
  3. 读到底部

这就是我想要的,但欢迎任何建议。

4

5 回答 5

6

你可以试试这个批处理文件来帮助你洗牌你的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 地址列表。

希望这可以帮助。

于 2013-10-16T01:27:01.680 回答
4

Here is a simpler method to randomize/randomise a file, no temp files needed. You can even reuse the same input filename.

Limitations are: blank lines and line starting with ; will be skipped, and lines starting with = will have all leading = signs stripped and ^ characters are doubled.

@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
于 2013-10-16T09:01:30.100 回答
1

放入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 地址。

于 2013-10-16T09:56:42.947 回答
1

这似乎有效。将文件的命令行参数提供给它以进行随机化。

    @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
于 2013-10-16T01:31:47.097 回答
1

我真的很喜欢foxidrive做法。尽管如此,我想提供一个解决方案,消除所有列出的限制(尽管cmd文件大小 < 2 GiB 和行长度 < ~ 8 KiB 等相关限制仍然存在)。

关键是延迟扩展,需要切换到不丢失感叹号。这解决了特殊字符的所有潜在问题,如^, &, %, !, (, ), <, >,|".

计数器index的实现是为了不丢失原始文本文件的一行,如果没有,可能会发生这种情况,因为random可能会返回重复值;index附加后,生成的变量名称是$$!random!.!index!唯一的。

findstr /N /R "^"命令在原始文件的每一行之前都有一个行号,后跟一个冒号。for /F因此,没有任何行在循环中会出现空,这会忽略此类。行号也隐含地解决了前导分号的问题,即 . 的默认eol字符for /F

最后,直到并包括第一个冒号的所有内容(请记住由添加的上述前缀findstr)在输出之前从每一行中删除,因此不再删除​​前导等号。

所以这里是代码:

@echo off
setlocal EnableExtensions DisableDelayedExpansion

set /A "index=0"
for /f "delims=" %%a in ('findstr /N /R "^" "%~dpn0.lst"') do (
    setlocal EnableDelayedExpansion
    for /F %%b in ("$$!random!.!index!") do (
        endlocal
        set "%%b=%%a"
    )
    set /A "index+=1"
)
> "%~dpn0.new" (
    for /f "delims=" %%a in ('set $$') do (
        set "item=%%a"
        setlocal EnableDelayedExpansion
        echo(!item:*:=!
        endlocal
    )
)

endlocal
exit /B
于 2016-08-18T01:41:59.543 回答