使用 PowerShell 删除文件名部分

问题描述

我在编码方面不是很了解,但我正在尝试使用 PowerShell 找到一种方法来从多个文件删除前 X 个字符和最后 X 个字符。因此,只保留中间部分。

例如) INV~1105619~43458304~~1913216023~0444857 ,其中 1913216023 是发票号。需要从文件名中删除之前和之后的任何内容

我用过: get-childitem *.pdf | rename-item -newname { string.substring(22) } 删除前 22 个字符,但无法创建代码删除剩余的一半。所有文件的字符数相同,但发票号前后的数字不同(每个文件名不同)。

非常感谢任何帮助/建议!

解决方法

有几种方法可以做到这一点。
如果您确定不会遇到命名冲突(因此所有文件都有不同的发票编号),请使用以下三个额外的替代方法:

(Get-ChildItem -Path 'D:\Test' -Filter '*~~*~*.pdf' -File) | 
    Rename-Item -NewName { 
        # my favorite method
        '{0}{1}' -f ($_.BaseName -split '~')[-2],$_.Extension

        # or
        # '{0}{1}' -f ($_.BaseName -replace '^.*~~(\d{10})~.+$','$1'),$_.Extension

        # or this one
        # '{0}{1}' -f ([regex]'~~(\d+)~').Match($_.BaseName).Groups[1].Value,$_.Extension

        # or if you are absolutely sure of the position and length of the invoice number
        # '{0}{1}' -f $_.BaseName.Substring(22,10),$_.Extension
    }

Get-ChildItem 行位于括号之间,以确保 FileInfo 对象的收集已完成,然后再继续。如果您不这样做,您可能会尝试多次重命名项目

,

假设目标子字符串总是具有相同的长度,则 substring() 有一个重载,它有一个长度参数。

'INV~1105619~43458304~~1913216023~0444857'.substring

OverloadDefinitions
-------------------
string Substring(int startIndex)
string Substring(int startIndex,int length)


$startIndex,$length = 22,10
'INV~1105619~43458304~~1913216023~0444857'.substring($startIndex,$length)

1913216023


dir ('?'*40) | rename-item -newname { $_.name.substring(22,10) } -whatif

What if: Performing the operation "Rename File" on target 
      "Item: C:\users\admin\foo\INV~1105619~43458304~~1913216023~0444857 
Destination: C:\users\admin\foo\1913216023".