关于跨服务器执行Robocopy时文件传输路径及优化方案的技术问询
嘿,这个问题我之前部署Web项目的时候刚好踩过类似的坑,给你详细捋清楚:
首先直接给你明确答案:是的,你当前的操作确实会让文件绕Server A中转一圈。原因很简单——Robocopy是在Server A上运行的进程,它读取Server B临时文件夹的文件时,会先把数据从Server B传到Server A的内存/临时缓存里,然后再从Server A把这些数据写回Server B的生产文件夹。哪怕两个文件夹就在Server B的同一个磁盘上,也得走这么一圈冤枉路,完全浪费了本地磁盘传输的速度优势。
那怎么优化呢?给你两个最实用的方案,核心都是让Robocopy的执行逻辑完全在Server B内部完成:
用PsExec远程触发Server B上的Robocopy
这是微软官方的Windows远程执行工具,不用担心第三方工具的兼容性问题。你在Server A上执行一条命令,就能让Server B自己跑Robocopy脚本,文件全程在Server B内部传输,速度就是本地磁盘复制的满速。举个实际可用的命令例子:psexec \\ServerB robocopy "D:\temp-publish" "D:\prod-folder" /MIR /Z /R:3
这里的参数简单说下:/MIR是镜像同步(会删除生产目录里临时文件夹没有的文件,按需调整),/Z支持断点续传,/R:3是复制失败重试3次,你可以根据自己的部署需求增减参数。用PowerShell远程执行(更推荐)
如果你的环境已经启用了PowerShell Remoting(现在企业级Windows环境基本都配置了),这个方法比PsExec更灵活,权限控制也更精细。你在Server A上运行这条命令,就能让Server B本地执行Robocopy:Invoke-Command -ComputerName ServerB -ScriptBlock { robocopy "D:\temp-publish" "D:\prod-folder" /MIR /NP }
其中/NP是不显示进度百分比,适合自动化部署脚本里用,避免日志太冗余。如果需要指定特定权限的账号执行,还可以加-Credential参数传入合法的账号信息。
另外还有个备选思路:如果你的发布流程允许的话,能不能直接从Server A把应用发布到Server B的生产目录?这样连临时文件夹的步骤都省了,但我猜你用临时文件夹应该是要做发布后的预验证(比如检查文件完整性、依赖是否齐全),所以这个可能只是备选,还是前面两个远程执行Robocopy的方案更贴合你的现有流程。
备注:内容来源于stack exchange,提问作者Airn5475




