PowerShell-截取选择字符串输出的一部分



我正在使用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

相关内容

  • 没有找到相关文章

最新更新