1. 这个报错到底卡在哪个环节第一次看到adb: CreateFileW 'nul' failed: 系统找不到指定的文件这个提示的人,十有八九是在 Windows 上敲完adb devices或者adb shell之后,屏幕冷不丁蹦出这么一行。它不像device not found那样直白,也不像unauthorized那样有明确的授权指引,字面上说的是“系统找不到指定的文件”,可你明明什么都没删,昨天还能用的环境今天怎么就找不到文件了。先把结论摆在前面:这个报错绝大多数情况下跟你的手机、数据线、USB 驱动没有半点关系,问题出在 Windows 系统里那个叫nul的特殊设备文件被“弄坏”了,或者被某些软件劫持了。adb在启动时会尝试打开nul这个设备来做输出重定向,一旦系统层面的nul不可用,CreateFileW这个 Windows API 调用就会失败,于是 adb 直接把这句话甩到你脸上。它影响的范围其实挺广:不只是 adb,很多命令行工具在 Windows 上都会在底层碰nul。所以你会看到一个很有意思的现象——adb 报错的同时,可能某些脚本、某些构建工具也开始抽风。反过来说,只要把nul修好,这一串连锁问题往往一起消失。这篇文章适合谁看:一是刚配好 Android 调试环境、被这个报错劝退的新手;二是用了几年 adb、自认为环境很熟但偶尔也会撞上这个坑的老手;三是做自动化测试、CI 流水线,需要在 Windows 机器上批量跑 adb 的工程人员。我会把原理、排查顺序、修复命令、以及我踩过的几个隐蔽坑都摊开讲,尽量让你照着做就能复现解决过程。2. 为什么偏偏是 nul 这个文件出问题2.1 nul 在 Windows 里到底是什么很多人对nul的认知停留在“Linux 里的 /dev/null”,觉得它就是个黑洞,写进去的东西消失不见。Windows 里确实有类似概念,nul是一个保留的设备名,属于 DOS 时代遗留下来的特殊设备命名空间。你可以在命令行里试一下:echo hello > nul这条命令不会在当前目录生成一个叫nul的文件,输出直接被丢弃。这就是它的正常行为。除了nul,Windows 还保留了一批这样的名字,比如con、aux、prn、com1到com9、lpt1到lpt9。这些名字在任何目录下都被系统优先解释为设备,而不是普通文件。关键点来了:正因为它们是保留名,正常情况下你没法在资源管理器里创建一个真正叫nul的文件。但“没法通过正常手段创建”不等于“绝对不会存在”。一旦某个程序用底层 API 或者特殊路径写法硬生生造出一个名为nul的实体文件,系统在解析时就会陷入混乱——它到底该把这个名字当成设备,还是当成文件?CreateFileW调用失败,往往就是这个混乱的直接表现。2.2 adb 为什么要去碰 nuladb 是跨平台工具,它在 Windows 上的实现里,为了处理标准输入输出的重定向、屏蔽某些不需要的输出,会走一套通用的文件打开逻辑。这套逻辑里对“空设备”的引用,在 Windows 平台就落到nul上。你可以把它理解成:adb 想找个地方把不重要的输出倒掉,它默认nul这个垃圾桶随时可用,结果一伸手发现垃圾桶被人换成了一个打不开的怪东西。这里有个容易被忽略的细节:报错信息里的CreateFileW带了个W,代表宽字符版本(Unicode)。也就是说 adb 是以 Unicode 路径去打开nul的。如果系统里存在一个名字大小写、编码形式诡异的nul实体,宽字符解析更容易出问题。这也是为什么有些人的环境用 ANSI 版本的工具没事,换成 Unicode 版本的工具就炸。2.3 哪些操作会把 nul 搞坏根据我这些年的排查记录,nul被破坏通常来自这几类操作:某些安装包或解压工具在释放文件时,路径拼接出错,意外生成了名为nul的文件。一些老旧的批处理脚本用> nul重定向,但在特定目录权限或路径含空格的情况下,重定向被错误解析成了创建文件。第三方安全软件、同步网盘、版本控制工具在扫描目录时,对保留名的处理不一致,把nul当成普通文件同步或还原了出来。手动在命令行里用了带路径的写法,比如type file > .\nul,某些 shell 环境下这会在当前目录真的落一个nul。我遇到过最离谱的一次,是某台机器上装了一个小众的日志采集工具,它把日志轮转的目标路径配成了nul,结果每次轮转都在工作目录里生成一个实体nul文件,adb 一跑就报错,查了半天才定位到是这个工具干的。注意:判断nul是否被实体化,不能只看资源管理器。资源管理器对保留名的显示本身就不靠谱,必须用命令行去验证。3. 一步步定位并干掉这个坏掉的 nul3.1 先确认报错是不是真的由 nul 引起不要一上来就删文件。先做个最小验证,确认问题边界。打开命令提示符,切到一个干净的空目录,比如C:\temp\adbtest,然后执行:adb version adb devices如果在这个空目录里 adb 正常,回到你原来报错的目录再执行一次就报错,那基本可以锁定:问题出在那个目录里存在实体nul,或者该目录的路径解析被污染了。这个对比测试非常关键,它能帮你排除掉“adb 本身装坏了”“USB 驱动挂了”这些干扰项。如果换到任何目录都报同样的错,那说明问题不在某个具体目录,而在系统层面——可能是nul设备被全局性地破坏了,或者 PATH 里某个环节有问题。这两种情况的处理方式不一样,先分清楚。3.2 用命令行揪出实体 nul 文件在疑似有问题的目录下,打开 cmd,执行:dir /a /x | findstr /i "nul"/a是显示所有属性包括隐藏和系统文件,/x会显示短文件名。如果输出里出现了nul相关的条目,恭喜你,找到元凶了。有时候它显示的名字不是纯nul,而是nul.或者nul(带尾随空格)这种变体,这些变体同样会触发问题,因为 Windows 在解析时会做规范化,把尾随点和空格去掉后还是nul。如果dir看不到,但你又高度怀疑,可以用 PowerShell 再扫一遍:Get-ChildItem -Force | Where-Object { $_.Name -match '^nul' }PowerShell 对保留名的枚举行为和 cmd 略有不同,两边都查一遍更保险。我实际排查时,遇到过 cmd 看不见、PowerShell 能看见的情况,也遇到过反过来的,所以别偷懒。3.3 删除实体 nul 的正确姿势找到了不代表能直接删。你在资源管理器里右键删除,大概率会提示“找不到该项目”或者直接没反应。用普通的del nul也不行,因为系统会把它解释成设备。正确的删除方式是用 Windows 的“扩展路径”语法,绕过保留名解析:del \\?\C:\temp\adbtest\nul这里的\\?\前缀是关键,它告诉系统“后面这串是字面路径,别做任何保留名和相对路径的解析”。把路径换成你实际报错目录的绝对路径。如果删除时报“拒绝访问”,先去掉文件的只读和系统属性:attrib -r -s -h \\?\C:\temp\adbtest\nul del \\?\C:\temp\adbtest\nul如果还是删不掉,可能是文件被某个进程占用。用资源监视器或者handle这类工具查一下哪个进程持有它,先结束那个进程再删。我碰到过同步网盘进程一直占着nul不放的情况,退出网盘客户端后立刻就能删。提示:删除操作一定要用绝对路径加\\?\前缀。用相对路径或者省略前缀,命令会被系统错误解析,轻则删不掉,重则误伤别的文件。3.4 系统级 nul 损坏的修复思路如果换任何目录都报错,那就要考虑系统层面的修复。先检查系统文件完整性,用管理员身份打开 cmd:sfc /scannow这个命令会扫描并尝试修复受保护的系统文件。跑完之后重启,再试 adb。如果sfc没解决问题,可以进一步用 DISM 修复系统映像:DISM /Online /Cleanup-Image /RestoreHealth这两个命令耗时都不短,但它们是处理系统级文件异常的标准手段。我个人的经验是,nul设备本身极少真正损坏,更多时候是环境变量、PATH 或者某个全局钩子程序在作祟。所以在跑sfc之前,先检查一下 PATH 里有没有奇怪的目录,以及有没有程序在全局范围劫持了文件操作。还有一个隐蔽点:某些输入法、剪贴板增强工具、窗口管理工具会注入全局钩子,干扰文件 API 的调用。如果你最近装过这类软件,可以试着临时退出它们再测 adb。我遇到过一次,某款截图工具的后台进程导致所有涉及nul的调用都失败,退出后一切正常。4. 修复之后怎么验证和预防复发4.1 验证修复是否彻底删掉实体nul或者修完系统之后,别急着庆祝。按这个顺序验证一遍:在原来报错的目录执行adb devices,确认不再出现CreateFileW报错。执行echo test > nul,确认没有在当前目录生成实体文件。用dir /a再扫一遍,确认没有nul残留。如果你有多个项目目录,挨个切过去跑一下 adb,确认不是只修好了一个目录。这四步走完,基本可以确认问题解决。如果第 2 步之后当前目录冒出了nul文件,说明系统层面的解析还是有问题,得回到 3.4 继续查。4.2 防止 nul 再次被创建预防比修复省事得多。几个实操建议:写批处理脚本时,重定向到空设备统一用> nul,不要写成> .\nul或者带引号的形式,后者在某些解析器下会创建实体文件。配置日志轮转、临时文件输出路径时,避开nul这个字面量作为文件名,用专门的临时目录加随机名。定期用脚本扫一遍常用工作目录,发现保留名实体文件就清理。可以写个简单的批处理放进计划任务。对同步网盘和版本控制工具,把工作目录里的保留名加入忽略列表,防止它们把异常文件同步来同步去。我自己的做法是在每个开发机的常用工作盘根目录放一个清理脚本,每周跑一次,扫nul、con、aux这些保留名实体。成本很低,但省去了很多次莫名其妙的排查。4.3 常见问题速查表现象可能原因处理方式仅特定目录报 CreateFileW nul 失败该目录存在实体 nul 文件用\\?\绝对路径删除所有目录都报同样错误系统级 nul 解析异常或全局钩子干扰退出可疑后台程序,跑 sfc/DISM删除 nul 时提示拒绝访问文件被进程占用或属性受限查占用进程,去只读系统属性后再删删完重启又出现有程序在持续生成 nul定位生成源,改其输出配置adb 正常但其他工具报 nul 错问题不在 adb,在系统或该工具按系统级思路排查这张表是我从多次实际处理中归纳出来的,覆盖了九成以上的场景。遇到新情况时,先对照表格缩小范围,再深入排查,效率会高很多。5. 几个容易误判的坑和我的实操心得5.1 别把锅甩给 USB 和驱动新手看到 adb 报错,第一反应往往是重装驱动、换数据线、换 USB 口。这个报错跟这些完全无关,因为CreateFileW失败发生在 adb 进程启动的早期阶段,那时候它还没开始跟设备通信。你在这一步折腾硬件,纯属浪费时间。判断方法很简单:如果adb version都报这个错,那百分之百是文件系统层面的问题,跟设备无关。5.2 路径里的空格和中文会放大问题我处理过的案例里,有相当一部分报错目录的路径里带空格或者中文。这不是说空格中文本身会导致nul出问题,而是它们会让路径解析更容易出错,尤其是在拼接\\?\前缀做删除操作时。\\?\前缀要求路径必须是完全规范化的绝对路径,不能有..、不能有相对成分,斜杠方向也要对。所以删除时务必用完整路径,比如:del \\?\D:\我的项目\android测试\nul如果路径里有特殊字符,建议先在资源管理器里复制完整路径,再手动加上\\?\前缀,避免手打出错。5.3 多版本 adb 共存时的干扰有些人的机器上装了多个 adb,比如 Android Studio 自带一个,单独下载的 platform-tools 里一个,某个手机助手又带一个。PATH 里顺序不同,实际调用的 adb 版本就不同。不同版本的 adb 对nul的处理细节可能有差异,这会导致“同一个目录,换个终端就报错/不报错”的诡异现象。排查时先用where adb确认当前调用的是哪个,再针对性处理。统一环境、只保留一个 adb 在 PATH 里,能省掉很多这类玄学问题。5.4 清理脚本的一个实用写法最后分享一个我常用的清理批处理片段,放在工作目录下双击即可运行:@echo off setlocal set TARGET=%~dp0 for %%F in (nul con aux prn) do ( if exist "\\?\%TARGET%%%F" ( attrib -r -s -h "\\?\%TARGET%%%F" >nul 2>&1 del "\\?\%TARGET%%%F" >nul 2>&1 echo 已清理: %%F ) ) echo 清理完成 pause这个脚本只处理当前目录,不会递归,避免误删。%~dp0取脚本所在目录,保证路径是绝对的。实际用下来,它帮我省了很多次手动敲长路径的麻烦。你可以按需把保留名列表加长,但注意别把正常文件误伤,所以列表里只放确定是保留名的那些。整个排查链路走下来,核心就一句话:nul是 Windows 的保留设备名,一旦被实体化成文件,依赖它的工具就会报CreateFileW失败。定位靠目录对比和命令行扫描,修复靠\\?\前缀删除或系统文件修复,预防靠规范脚本写法和定期清理。把这套流程走熟,以后再看到这个报错,几分钟就能搞定,不用再对着屏幕发懵。
1. 这个报错到底卡在哪个环节第一次看到adb: CreateFileW 'nul' failed: 系统找不到指定的文件这个提示的人,十有八九是在 Windows 上敲完adb devices或者adb shell之后,屏幕冷不丁蹦出这么一行。它不像device not found那样直白,也不像unauthorized那样有明确的授权指引,字面上说的是“系统找不到指定的文件”,可你明明什么都没删,昨天还能用的环境今天怎么就找不到文件了。先把结论摆在前面:这个报错绝大多数情况下跟你的手机、数据线、USB 驱动没有半点关系,问题出在 Windows 系统里那个叫nul的特殊设备文件被“弄坏”了,或者被某些软件劫持了。adb在启动时会尝试打开nul这个设备来做输出重定向,一旦系统层面的nul不可用,CreateFileW这个 Windows API 调用就会失败,于是 adb 直接把这句话甩到你脸上。它影响的范围其实挺广:不只是 adb,很多命令行工具在 Windows 上都会在底层碰nul。所以你会看到一个很有意思的现象——adb 报错的同时,可能某些脚本、某些构建工具也开始抽风。反过来说,只要把nul修好,这一串连锁问题往往一起消失。这篇文章适合谁看:一是刚配好 Android 调试环境、被这个报错劝退的新手;二是用了几年 adb、自认为环境很熟但偶尔也会撞上这个坑的老手;三是做自动化测试、CI 流水线,需要在 Windows 机器上批量跑 adb 的工程人员。我会把原理、排查顺序、修复命令、以及我踩过的几个隐蔽坑都摊开讲,尽量让你照着做就能复现解决过程。2. 为什么偏偏是 nul 这个文件出问题2.1 nul 在 Windows 里到底是什么很多人对nul的认知停留在“Linux 里的 /dev/null”,觉得它就是个黑洞,写进去的东西消失不见。Windows 里确实有类似概念,nul是一个保留的设备名,属于 DOS 时代遗留下来的特殊设备命名空间。你可以在命令行里试一下:echo hello > nul这条命令不会在当前目录生成一个叫nul的文件,输出直接被丢弃。这就是它的正常行为。除了nul,Windows 还保留了一批这样的名字,比如con、aux、prn、com1到com9、lpt1到lpt9。这些名字在任何目录下都被系统优先解释为设备,而不是普通文件。关键点来了:正因为它们是保留名,正常情况下你没法在资源管理器里创建一个真正叫nul的文件。但“没法通过正常手段创建”不等于“绝对不会存在”。一旦某个程序用底层 API 或者特殊路径写法硬生生造出一个名为nul的实体文件,系统在解析时就会陷入混乱——它到底该把这个名字当成设备,还是当成文件?CreateFileW调用失败,往往就是这个混乱的直接表现。2.2 adb 为什么要去碰 nuladb 是跨平台工具,它在 Windows 上的实现里,为了处理标准输入输出的重定向、屏蔽某些不需要的输出,会走一套通用的文件打开逻辑。这套逻辑里对“空设备”的引用,在 Windows 平台就落到nul上。你可以把它理解成:adb 想找个地方把不重要的输出倒掉,它默认nul这个垃圾桶随时可用,结果一伸手发现垃圾桶被人换成了一个打不开的怪东西。这里有个容易被忽略的细节:报错信息里的CreateFileW带了个W,代表宽字符版本(Unicode)。也就是说 adb 是以 Unicode 路径去打开nul的。如果系统里存在一个名字大小写、编码形式诡异的nul实体,宽字符解析更容易出问题。这也是为什么有些人的环境用 ANSI 版本的工具没事,换成 Unicode 版本的工具就炸。2.3 哪些操作会把 nul 搞坏根据我这些年的排查记录,nul被破坏通常来自这几类操作:某些安装包或解压工具在释放文件时,路径拼接出错,意外生成了名为nul的文件。一些老旧的批处理脚本用> nul重定向,但在特定目录权限或路径含空格的情况下,重定向被错误解析成了创建文件。第三方安全软件、同步网盘、版本控制工具在扫描目录时,对保留名的处理不一致,把nul当成普通文件同步或还原了出来。手动在命令行里用了带路径的写法,比如type file > .\nul,某些 shell 环境下这会在当前目录真的落一个nul。我遇到过最离谱的一次,是某台机器上装了一个小众的日志采集工具,它把日志轮转的目标路径配成了nul,结果每次轮转都在工作目录里生成一个实体nul文件,adb 一跑就报错,查了半天才定位到是这个工具干的。注意:判断nul是否被实体化,不能只看资源管理器。资源管理器对保留名的显示本身就不靠谱,必须用命令行去验证。3. 一步步定位并干掉这个坏掉的 nul3.1 先确认报错是不是真的由 nul 引起不要一上来就删文件。先做个最小验证,确认问题边界。打开命令提示符,切到一个干净的空目录,比如C:\temp\adbtest,然后执行:adb version adb devices如果在这个空目录里 adb 正常,回到你原来报错的目录再执行一次就报错,那基本可以锁定:问题出在那个目录里存在实体nul,或者该目录的路径解析被污染了。这个对比测试非常关键,它能帮你排除掉“adb 本身装坏了”“USB 驱动挂了”这些干扰项。如果换到任何目录都报同样的错,那说明问题不在某个具体目录,而在系统层面——可能是nul设备被全局性地破坏了,或者 PATH 里某个环节有问题。这两种情况的处理方式不一样,先分清楚。3.2 用命令行揪出实体 nul 文件在疑似有问题的目录下,打开 cmd,执行:dir /a /x | findstr /i "nul"/a是显示所有属性包括隐藏和系统文件,/x会显示短文件名。如果输出里出现了nul相关的条目,恭喜你,找到元凶了。有时候它显示的名字不是纯nul,而是nul.或者nul(带尾随空格)这种变体,这些变体同样会触发问题,因为 Windows 在解析时会做规范化,把尾随点和空格去掉后还是nul。如果dir看不到,但你又高度怀疑,可以用 PowerShell 再扫一遍:Get-ChildItem -Force | Where-Object { $_.Name -match '^nul' }PowerShell 对保留名的枚举行为和 cmd 略有不同,两边都查一遍更保险。我实际排查时,遇到过 cmd 看不见、PowerShell 能看见的情况,也遇到过反过来的,所以别偷懒。3.3 删除实体 nul 的正确姿势找到了不代表能直接删。你在资源管理器里右键删除,大概率会提示“找不到该项目”或者直接没反应。用普通的del nul也不行,因为系统会把它解释成设备。正确的删除方式是用 Windows 的“扩展路径”语法,绕过保留名解析:del \\?\C:\temp\adbtest\nul这里的\\?\前缀是关键,它告诉系统“后面这串是字面路径,别做任何保留名和相对路径的解析”。把路径换成你实际报错目录的绝对路径。如果删除时报“拒绝访问”,先去掉文件的只读和系统属性:attrib -r -s -h \\?\C:\temp\adbtest\nul del \\?\C:\temp\adbtest\nul如果还是删不掉,可能是文件被某个进程占用。用资源监视器或者handle这类工具查一下哪个进程持有它,先结束那个进程再删。我碰到过同步网盘进程一直占着nul不放的情况,退出网盘客户端后立刻就能删。提示:删除操作一定要用绝对路径加\\?\前缀。用相对路径或者省略前缀,命令会被系统错误解析,轻则删不掉,重则误伤别的文件。3.4 系统级 nul 损坏的修复思路如果换任何目录都报错,那就要考虑系统层面的修复。先检查系统文件完整性,用管理员身份打开 cmd:sfc /scannow这个命令会扫描并尝试修复受保护的系统文件。跑完之后重启,再试 adb。如果sfc没解决问题,可以进一步用 DISM 修复系统映像:DISM /Online /Cleanup-Image /RestoreHealth这两个命令耗时都不短,但它们是处理系统级文件异常的标准手段。我个人的经验是,nul设备本身极少真正损坏,更多时候是环境变量、PATH 或者某个全局钩子程序在作祟。所以在跑sfc之前,先检查一下 PATH 里有没有奇怪的目录,以及有没有程序在全局范围劫持了文件操作。还有一个隐蔽点:某些输入法、剪贴板增强工具、窗口管理工具会注入全局钩子,干扰文件 API 的调用。如果你最近装过这类软件,可以试着临时退出它们再测 adb。我遇到过一次,某款截图工具的后台进程导致所有涉及nul的调用都失败,退出后一切正常。4. 修复之后怎么验证和预防复发4.1 验证修复是否彻底删掉实体nul或者修完系统之后,别急着庆祝。按这个顺序验证一遍:在原来报错的目录执行adb devices,确认不再出现CreateFileW报错。执行echo test > nul,确认没有在当前目录生成实体文件。用dir /a再扫一遍,确认没有nul残留。如果你有多个项目目录,挨个切过去跑一下 adb,确认不是只修好了一个目录。这四步走完,基本可以确认问题解决。如果第 2 步之后当前目录冒出了nul文件,说明系统层面的解析还是有问题,得回到 3.4 继续查。4.2 防止 nul 再次被创建预防比修复省事得多。几个实操建议:写批处理脚本时,重定向到空设备统一用> nul,不要写成> .\nul或者带引号的形式,后者在某些解析器下会创建实体文件。配置日志轮转、临时文件输出路径时,避开nul这个字面量作为文件名,用专门的临时目录加随机名。定期用脚本扫一遍常用工作目录,发现保留名实体文件就清理。可以写个简单的批处理放进计划任务。对同步网盘和版本控制工具,把工作目录里的保留名加入忽略列表,防止它们把异常文件同步来同步去。我自己的做法是在每个开发机的常用工作盘根目录放一个清理脚本,每周跑一次,扫nul、con、aux这些保留名实体。成本很低,但省去了很多次莫名其妙的排查。4.3 常见问题速查表现象可能原因处理方式仅特定目录报 CreateFileW nul 失败该目录存在实体 nul 文件用\\?\绝对路径删除所有目录都报同样错误系统级 nul 解析异常或全局钩子干扰退出可疑后台程序,跑 sfc/DISM删除 nul 时提示拒绝访问文件被进程占用或属性受限查占用进程,去只读系统属性后再删删完重启又出现有程序在持续生成 nul定位生成源,改其输出配置adb 正常但其他工具报 nul 错问题不在 adb,在系统或该工具按系统级思路排查这张表是我从多次实际处理中归纳出来的,覆盖了九成以上的场景。遇到新情况时,先对照表格缩小范围,再深入排查,效率会高很多。5. 几个容易误判的坑和我的实操心得5.1 别把锅甩给 USB 和驱动新手看到 adb 报错,第一反应往往是重装驱动、换数据线、换 USB 口。这个报错跟这些完全无关,因为CreateFileW失败发生在 adb 进程启动的早期阶段,那时候它还没开始跟设备通信。你在这一步折腾硬件,纯属浪费时间。判断方法很简单:如果adb version都报这个错,那百分之百是文件系统层面的问题,跟设备无关。5.2 路径里的空格和中文会放大问题我处理过的案例里,有相当一部分报错目录的路径里带空格或者中文。这不是说空格中文本身会导致nul出问题,而是它们会让路径解析更容易出错,尤其是在拼接\\?\前缀做删除操作时。\\?\前缀要求路径必须是完全规范化的绝对路径,不能有..、不能有相对成分,斜杠方向也要对。所以删除时务必用完整路径,比如:del \\?\D:\我的项目\android测试\nul如果路径里有特殊字符,建议先在资源管理器里复制完整路径,再手动加上\\?\前缀,避免手打出错。5.3 多版本 adb 共存时的干扰有些人的机器上装了多个 adb,比如 Android Studio 自带一个,单独下载的 platform-tools 里一个,某个手机助手又带一个。PATH 里顺序不同,实际调用的 adb 版本就不同。不同版本的 adb 对nul的处理细节可能有差异,这会导致“同一个目录,换个终端就报错/不报错”的诡异现象。排查时先用where adb确认当前调用的是哪个,再针对性处理。统一环境、只保留一个 adb 在 PATH 里,能省掉很多这类玄学问题。5.4 清理脚本的一个实用写法最后分享一个我常用的清理批处理片段,放在工作目录下双击即可运行:@echo off setlocal set TARGET=%~dp0 for %%F in (nul con aux prn) do ( if exist "\\?\%TARGET%%%F" ( attrib -r -s -h "\\?\%TARGET%%%F" >nul 2>&1 del "\\?\%TARGET%%%F" >nul 2>&1 echo 已清理: %%F ) ) echo 清理完成 pause这个脚本只处理当前目录,不会递归,避免误删。%~dp0取脚本所在目录,保证路径是绝对的。实际用下来,它帮我省了很多次手动敲长路径的麻烦。你可以按需把保留名列表加长,但注意别把正常文件误伤,所以列表里只放确定是保留名的那些。整个排查链路走下来,核心就一句话:nul是 Windows 的保留设备名,一旦被实体化成文件,依赖它的工具就会报CreateFileW失败。定位靠目录对比和命令行扫描,修复靠\\?\前缀删除或系统文件修复,预防靠规范脚本写法和定期清理。把这套流程走熟,以后再看到这个报错,几分钟就能搞定,不用再对着屏幕发懵。