问题描述
我正在使用 Azcopy 复制大量数据,我需要一种方法来检索未能复制的文件。
Azcopy 从每个作业创建一个不错的日志,并且可以执行以下操作:
Select-String -Path C:\Users\XXX\.azcopy\Projects\304c22cc-d37d-d743-7597-a160ac0ebad2.log -Pattern 'UPLOADFailed'
但是输出看起来是这样的:
.azcopy\Projects\304c22cc-d37d-d743-7597-a160ac0ebad2.log:25528:2021/01/04 16:45:19 ERR: [P#0-T#2357] 上传失败: %5C%5C\UNC\fileserver.contoso.network\PROJ$\AAAA\BBBB\CCCC\Eigenerkl+�rungen.pdf_DOC001719.pdf:000:无法检查目标文件是否存在。 -> github.com/Azure/azure-storage-file-go/azfile.newStorageError,/home/vsts/go/pkg/mod/github.com/!azure/azure-storage-file-go@v0.8.0/azfile/ zc_storage_error.go:42
我只需要从这个输出中找出文件路径和名称。在下面的例子中,我需要开出:
fileserver.contoso.network\PROJ$\AAAA\BBBB\CCCC\Eigenerkl+�rungen.pdf_DOC001719.pdf
有人知道怎么做吗?我无法根据文件名进行搜索,因为我有 2000 多个失败的文件,我需要将它们全部剔除。
亲切的问候, 沃伊切赫
解决方法
-
定义您的模式 regex,使其仅捕获感兴趣的部分。
-
通过
Microsoft.PowerShell.Commands.MatchInfo
输出的Select-String
实例的.Matches
集合访问捕获的部分。
$file = 'C:\Users\XXX\.azcopy\Projects\304c22cc-d37d-d743-7597-a160ac0ebad2.log'
# Define the pattern as a regex that captures only the part of interest.
$pattern = '(?<=UPLOADFAILED:%5C%5C\\UNC\\)[^_]+'
(Select-String -Pattern $pattern -LiteralPath $file).Matches.Value
假设是:
-
%5C%5C\UNC\
是感兴趣路径前面的固定字符串(注意\
如何转义为\\
以便逐字处理在正则表达式中)。 -
一个
_
字符标记路径的结尾。
另请注意,Select-String
默认匹配大小写不敏感;根据需要使用 -CaseSensitive
。
最后,示例数据中存在 �
(REPLACEMENT CHARACTER,U+FFFD
) 表明文件的字符编码被误解,您可以通过 {{1} } 范围。再说一次,这些字符可能指向一个之前问题,导致这些路径被列为无法开始。
谢谢! 你给我指明了正确的方向。该死的我需要学习正则表达式。 不过,我对模式做了一些小调整。这对我有用:
$pattern2 = '(?<=UPLOADFAILED:\s%5C%5C\?\\UNC\\).*(?=\s\:\s000)'
再次感谢, 沃伊泰克