【问题标题】:PowerShell - carve out a part of the select-string outputPowerShell - 划分选择字符串输出的一部分
【发布时间】:2021-01-05 13:24:18
【问题描述】:

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

亲切的问候, 沃伊切赫

【问题讨论】:

    标签: powershell azcopy select-string


    【解决方案1】:
    $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。

    最后,您的示例数据中存在�(替换字符,U+FFFD)表明文件的字符编码被误解了,您可以通过-Encoding 参数来解决这个问题。再说一次,这些字符可能指向一个先前的问题,导致这些路径被列为未能开始。

    【讨论】:

      【解决方案2】:

      谢谢! 你为我指明了正确的方向。该死的我需要学习正则表达式。 不过,我对图案做了一些小的调整。这对我有用:

      $pattern2 = '(?<=UPLOADFAILED:\s%5C%5C\?\\UNC\\).*(?=\s\:\s000)'
      

      再次感谢, 沃伊泰克

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多