删除文件名部分 w/PowerShell

Remove Sections of File Names w/PowerShell

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

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

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

非常感谢help/advice!

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

(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})~.+$', ''), $_.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\foo13216023".