基础批处理自复制代码的危险性如何?
聊聊你这个批处理自复制程序的溢出问题
嘿,这个想法挺有意思的——用批处理实现冯·诺依曼自复制机器的简化版,我之前也玩过类似的小脚本!先帮你梳理下加了自动运行后会发生的情况,以及所谓的“溢出”问题:
首先,先还原下你的脚本逻辑(大概是这样吧?):
@echo off setlocal enabledelayedexpansion :: 获取当前运行的批处理文件名 set "current_file=%~nx0" :: 生成新文件名:在原文件名的E后面再加一个E set "new_file=!current_file:~0,-4!E.bat" :: 复制自身到新文件 copy "%current_file%" "%new_file%" :: 你想添加的自动运行新副本的命令 start "" "%new_file%"
核心问题解答:
会不会无限复制导致溢出?
不会无限循环下去,但会生成一堆文件直到触发系统的硬限制。Windows的文件系统对文件名/路径长度有明确限制:- 传统的NTFS默认限制路径总长度为260字符(包括盘符、文件夹和文件名);
- 即使开启了Windows 10/11的长路径支持,单个路径最多也只能到32767字符。
当你的文件名增长到让整个路径超过这个限制时,copy命令会直接报错(提示“文件名太长”),后续的start命令也不会执行,复制链条就直接中断了。
有没有系统机制主动阻止?
系统本身不会特意拦截这种自复制行为——除非你装的杀毒软件把它判定为蠕虫类恶意程序(毕竟不断复制自身的行为和病毒有点像)。真正让它停下来的,是文件系统的长度限制这个硬门槛。实际运行会发生什么?
加了自动运行后,会进入递归启动的状态:WEE.bat生成WEEE.bat并启动它,WEEE.bat生成WEEEE.bat再启动它……直到文件名触达长度限制,复制失败,最后一个启动的批处理会弹出错误窗口后退出,整个过程就结束了。期间会在当前目录生成一串文件名越来越长的bat文件,占用一点磁盘空间,手动删除就行。
给你的小建议
如果只是做测试,不想生成太多文件,可以加个简单的终止条件,比如限制文件名的长度:
@echo off setlocal enabledelayedexpansion set "current_file=%~nx0" :: 当文件名(不含后缀)超过10个字符时停止 if "!current_file:~0,-4!" gtr "WEEEEEEEEE" goto :eof set "new_file=!current_file:~0,-4!E.bat" copy "%current_file%" "%new_file%" >nul 2>&1 start "" "%new_file%"
这样就能控制复制的次数,避免生成一堆冗余文件~
内容的提问来源于stack exchange,提问作者Sixela963
相关产品推荐
相关产品推荐

