通过runas调用robocopy备份时无法正常生成操作日志的问题咨询
失败原因拆解
- 在外层追加
>> C:\apache-backup.log未生成有效日志的问题:runas本身不会转发启动的高权限子进程(robocopy)的输出流,外层的重定向规则只能捕获runas自身的执行状态提示,完全无法关联robocopy的运行输出,最终得到的日志自然是空文件。 - 在引号内部追加
>> C:\apache-backup.log未生成日志的问题:- 原命令中排除目录路径
donotcopy\结尾的单个反斜杠,会触发Windows命令行解析规则:奇数个反斜杠紧邻双引号时,最后一个反斜杠会转义后续的双引号,导致原命令的字符串边界错位,后续添加的重定向语句会被整体当成robocopy的参数传递,不会被命令行解释器识别为重定向逻辑。 - 命令行的
>>重定向是cmd.exe解释器的内置语法,不是robocopy的程序参数,哪怕引号配对正确,直接把重定向语句写在robocopy命令后面,也会被robocopy当成普通路径/选项解析,不会触发流写入。
- 原命令中排除目录路径
可落地的调整方案
方案1:使用robocopy内置日志能力(首选,稳定性最高)
直接利用robocopy本身的日志功能,不依赖命令行重定向逻辑,不受runas的流转发限制,调整后的命令如下:
runas /savecred /user:domain\user "robocopy C:\Program Files\Apache Software Foundation \\share\drive\Backups\Apache /MIR /XD C:\Program Files\Apache Software Foundation\Apache2.4\donotcopy /LOG:C:\apache-backup.log /TEE"
参数说明:
/LOG:C:\apache-backup.log:将robocopy全量运行输出写入指定日志文件,默认执行覆盖写入;如果需要保留历史日志追加写入,将参数替换为/LOG+:C:\apache-backup.log即可。/TEE:保持原有窗口实时显示运行进度的行为,不会因为开启日志写入丢失实时反馈。- 已移除原排除目录路径结尾多余的反斜杠,从根源上避免引号转义错位的问题。
方案2:通过子cmd触发原生流重定向
如果需要使用系统原生的流重定向能力,需要在runas调用中显式启动子cmd执行带重定向的命令,同时转义外层的重定向符号,避免被父cmd提前解析,调整后的命令如下:
runas /savecred /user:domain\user "cmd /c robocopy C:\Program Files\Apache Software Foundation \\share\drive\Backups\Apache /MIR /XD C:\Program Files\Apache Software Foundation\Apache2.4\donotcopy ^>^> C:\apache-backup.log"
注意事项:
- 两个重定向符号
>前面必须添加^转义,否则重定向逻辑会被父cmd捕获,回到最初“日志文件为空”的问题。 - 同样需要移除原路径结尾多余的反斜杠,防止引号配对错误。
内容的提问来源于stack exchange,提问作者user1305988
相关产品推荐
相关产品推荐

