PowerShell - 雕刻出选择字符串输出的一部分

问题描述

我正在使用 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 多个失败的文件,我需要将它们全部剔除。

亲切的问候, 沃伊切赫

解决方法

$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)'

再次感谢, 沃伊泰克