第一次在这里发帖!抱歉,我还没有内联图像和链接的声誉点。
简洁版本:
我正在调查我们的用户报告的一个问题。他们有批处理脚本,可以快速复制/合并/重命名/压缩/删除网络共享上的文件,有时批处理文件会因为找不到/访问其中一个文件而崩溃。
在 Windows 资源管理器中打开共享并快速按下 F5 键时,错误率会大幅增加。完全关闭资源管理器并保留文件夹,几乎可以完全消除问题。
我已将其缩小到(可能)是 Windows 7 和 2008r2 上的 Windows 资源管理器或 smb2.x 的问题。Win8、Win10 和 2012R2 没有出现此问题。我想与社区核实这是我的测试方法中的错误,还是操作系统中确实存在错误。
长版本,重现步骤,测试过的解决方法:
为了测试问题,创建了一个批处理文件
- 创建一个包含随机数的文件
- 重命名文件 4 次(例如 file.txt -> file.bak -> file.old -> file.txt)
- 读取文件内容并比较数字
这会无限循环运行,在没有 CPU/内存错误的系统中,它永远不会失败。但它确实会失败——有时它只是找不到它应该重命名或读取的文件(例如,它会失败并显示“找不到 file.old”)
以下是示例截图:
为了确保这不是批处理文件本身的问题,我编写了一个小型 c# 程序,它基本上可以完成相同的任务。我可以使用此程序 1:1 重现该问题。
在测试过程中,我注意到当我在 Windows 资源管理器中打开目标文件夹时,问题发生的频率比没有打开文件夹时更高。我怀疑这与“自动刷新”有关。通过“强制”此条件(F5 按钮),我现在每次都可以非常快速地重现该问题。
所以我做了以下测试:serverfault.com/questions/642254/files-not-appearing-caching-or
在 win7 客户端上禁用资源管理器自动刷新设置
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoRemoteRecursiveEvents"=dword:00000001
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer]
"NoRemoteChangeNotify"=dword:00000001
这解决了不触摸键盘时的问题,程序可以长时间运行而不会出现问题。但是,当我手动按下并继续按 F5 以快速刷新资源管理器时,问题再次出现:
我目前的结论是:浏览器的“刷新”功能导致“网络”传输出现问题,或者文件锁、共享冲突等……?
进一步的调查: 我想找出这种情况发生在哪些系统上,所以我对不同的操作系统进行了大量测试(始终使用 F5 刷新技巧)。我只能在 win7 和 2008r2 中重现此问题,win8、10 和 2012r2 没有错误。我通过在未加入域的虚拟机上运行测试排除了公司安全设置,并且在家里的私人计算机上也存在问题。
剩下唯一需要测试的是 SMB 版本,因此我在 win7 上禁用了 SMB2.x(http s://support.microsoft.com/de-de/kb/2696547)
sc.exe config lanmanworkstation depend= bowser/mrxsmb10/nsi
sc.exe config mrxsmb20 start= disabled
结果:通过在 Windows 7 上切换到 SMB1.5,问题得到“解决”(更多的是一种解决方法)。
结论:
使用 SMB2.x 时,在刷新资源管理器文件夹的同时快速创建/重命名网络共享上的文件会导致 win7 和 2008r2 上出现问题。切换到 SMB 1.5 可解决问题。无论 SMB 版本是什么,较新的操作系统都不会受到影响。
我的问题是:
- 我测试的是否正确,有人可以重现这个吗?批处理文件和 c# 源代码位于 pastebin 链接中。
- windows 资源管理器或 win7/2008r2 上的 smb 堆栈是否存在错误?我应该开具 MS 支持单吗?
- 是否有任何其他设置可以微调 SMB/lanman 服务/等,从而帮助解决这种情况?
批处理文件 -> pastebin.com/Dc2QHB8y
c# 测试程序 -> pastebin.com/Xx11MFdr
系统测试列表 -> pastebin.com/p24Jz0Aw