Robocopy是否有可提取路径超260字符文件时间戳的开关?
解决方案
方案1:最小改动修复现有代码
你之前[System.IO.FileInfo]返回无效日期的核心原因是没有给长路径加\\?\前缀,和你调用Get-FileHash、Get-Content的逻辑一致,给路径加上前缀即可正常读取属性:
把原来的两行属性获取代码:
LastWriteTime = ([System.IO.FileInfo] $matches.FullName).LastWriteTime Created = ([System.IO.FileInfo] $matches.FullName).creationtime
替换为:
LastWriteTime = ([System.IO.FileInfo] "\\?\$($matches.FullName)").LastWriteTime Created = ([System.IO.FileInfo] "\\?\$($matches.FullName)").CreationTime
该方案不需要修改其他现有逻辑,直接替换即可解决长路径下时间戳读取异常的问题。
方案2:用robocopy /TS直接提取时间戳(执行效率更高)
你之前加了/TS开关后报错,是因为原有正则表达式没有匹配新增的时间戳字段。开启/TS后robocopy的输出行格式为[上次修改时间] [文件大小] [完整路径],对应修改匹配规则即可:
- 确认robocopy参数中的
/TS开关已保留 - 把原有的匹配规则:
If ($_.Trim() -match "^(?<Children>\d+)\s(?<FullName>.*)")
替换为适配带时间戳输出的正则:
If ($_.Trim() -match "^(?<Date>\d{4}/\d{2}/\d{2}\s\d{2}:\d{2}:\d{2})\s+(?<Size>\d+)\s+(?<FullName>.*)")
- 直接从匹配结果中转换时间即可,不需要额外查询文件属性:
LastWriteTime = [datetime]::ParseExact($matches.Date, "yyyy/MM/dd HH:mm:ss", $null)
该方案复用robocopy的输出结果,不需要额外调用接口查询文件属性,文件量大时执行效率明显更高。如果需要提取创建时间,给robocopy再加/TC开关,对应修改正则规则即可。
注意事项
每次执行脚本前清空c:\temp\test.txt的内容,避免旧日志干扰匹配结果。
内容的提问来源于stack exchange,提问作者oymonk
相关产品推荐
相关产品推荐

