我正在使用AzCopy复制大量数据,我需要有一种方法来检索复制失败的文件。
AzCopy从每个作业中创建一个不错的日志,可以做这样的事情:
Select-String -Path C:UsersXXX.azcopyProjects304c22cc-d37d-d743-7597-a160ac0ebad2.log -Pattern 'UPLOADFAILED'
但输出看起来是这样的:
.azcopy \Projects\304c22cc-d37d-d743-7597-a160ac0ebad2。日志:25528:2021/01/04 16:45:19错误:[p#0-T#2357]上传失败:%5C%5C\UNC\fileserver.contoso.network\PROJ$\AAAAA\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$\AAAAA\BBBB\CCCC\Eigenerkl+�rungen.pdf_DOC001719.pdf
有人知道怎么做吗?我无法根据文件名进行搜索,因为我有2000多个文件失败了,我需要将它们全部删除。
谨致问候,沃伊切赫
-
定义模式正则表达式,使其只捕获感兴趣的部分。
-
通过
Select-String
输出的Microsoft.PowerShell.Commands.MatchInfo
实例的.Matches
集合访问捕获的部分。
$file = 'C:UsersXXX.azcopyProjects304c22cc-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%5CUNC
是感兴趣的路径前面的一个固定字符串(请注意是如何转义为
\
的,以便在正则表达式中逐字逐句地处理它们(。_
字符表示路径的结束。
还要注意,默认情况下,Select-String
不区分大小写匹配;根据需要使用-CaseSensitive
。
最后,样本数据中存在�
(REPLACEMENT CHARACTER,U+FFFD
(,这表明文件的字符编码被误解了,您可以通过-Encoding
参数来解决这个问题。然后,这些字符可能指向以前的问题,该问题导致这些路径从一开始就被列为失败。
谢谢!你为我指明了正确的方向。该死,我需要学习正则表达式。不过我在图案上做了一个小调整。这对我有效:
$pattern2 = '(?<=UPLOADFAILED:s%5C%5C?\UNC\).*(?=s:s000)'
再次感谢,Wojtek